设计模式——结构模式

定义

结构模式(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),运用共享技术有效地支持大量细粒度的对象。

应用场景:
       如果一个程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用;
       还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象

优点:
       可以避免大量非常相似类的开销
       通过共享大幅度减少单个实例的数目

猜你喜欢

转载自blog.csdn.net/xyf13920745534/article/details/81411510