定义
结构模式(Structural Pattern)描述如何将类或者对象结合在一起形成更大的结构。结构模式描述两种不同的东西:类与类实例。
分类
结构模式可以分为类的结构模式和对象的结构模式两种。
类的结构模式
类的结构模式使用集成来把类、接口等组合在一起,以形成更大的结构。当一个类从父类继承并实现某接口时,这个新的类就 把父类的结构和接口的结构结合起来。类的结构模式是静态的。一个类的结构模式的典型例子,就是类形式的适配器模式。
对象的结构模式
对象的结构模式描述怎样把各种不同类型的对象组合在一起,以实现新的功能的方法。对象的结构模式是动态的。
具体模式
适配器模式(Adapter)
适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本接口不兼容而不能一起工作的那些类可以一起工作。
应用场景:
你想使用一个已经存在的类,而它的接口不符合你的需求。
你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作。
你想使用一些已经存在的类,但是不可能对每一个都进行子类化匹配它们的接口。对象适配器可以适配它的父类的接口。
优点:
1.符合“开闭原则”,可以在不修改原有代码的基础上复用现有类
2.提高了类的复用度,源角色和目标角色在系统中同时存在
3.灵活性好,当不需要适配器模式时,可以直接删除
缺点:
采用类适配器模式,提高了类的耦合性
装饰模式(Decorator)
装饰模式(Decorator),动态地给一个对象添加一个额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。
应用场景;
1.为已有的功能动态的添加更多的功能
2.为兄弟类进行加装或改装功能
3.对一个类的功能进行扩展,或给一个类增加附加功能
优点:
把类中的装饰功能从类中搬移去除,简化原来的类
2.有效把类的核心职责和装饰功能区分开了,可以去除相关类中重复的装饰逻辑
3.装饰类之间彼此独立
缺点:
装饰模式的装饰顺序混乱后容易出现问题
代理模式(Proxy)
代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。
应用场景:
第一,远程代理,也就是为一个对象在不同的地址空间提供局部代表。
第二,虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
第三,安全代理,用来控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候。
第四,智能指引,是指当调用真实的对象时,代理处理另外一些事。
优点:
代理模式能够将调用用于真正被调用的对象隔离,在一定程度上降低了系统的耦合度;
代理对象在客户端和目标对象之间起到一个中介的作用,这样可以起到对目标对象的保护。代理对象可以在对目标对象发出请求之前进行一个额外的操作,例如权限检查等。
缺点:
由于在客户端和真实主题之间增加了一个代理对象,所以会造成请求的处理速度变慢
实现代理类也需要额外的工作,从而增加了系统的实现复杂度。
外观模式(Facade)
外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
应用场景:
为复杂的模块或子系统体用一个供外界访问的接口
对一个遗留的大型系统进行维护和扩展
优点:
提供了一个接口,减少了类之间的依赖
提高了安全性
桥接模式(Bridge)
桥接模式(Bridge),将抽象部分与它的实现部分分离,使他们都可以独立的变化。
应用场景:
1.不希望或不适合使用继承的场景
2.接口或抽象类不稳定的场景
3.重用性要求较高的场景
4.解决多层继承
优点:
减少了实现部分之间的耦合,抽象和实现均可自由扩展
组合模式(Composite)
组合模式(Composite),将对象组合成树形结构以表示‘部分-整体’的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。
应用场景:
需求是体现部分与整体层次的结构时,希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时。
好处:
让客户可以一致地使用组合结构和单个对象
享元模式(Flyweight)
享元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象。
应用场景:
如果一个程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用;
还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象
优点:
可以避免大量非常相似类的开销
通过共享大幅度减少单个实例的数目