设计模式——结构型

来源:互联网 发布:风险矩阵模型 编辑:程序博客网 时间:2024/05/16 10:32

   将结构型设计模式按其突出体现原则划分如下:

   1.适配器模式(Adapter)

   “将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。”

   使用场合:想使用一个已经存在但接口不符合要求的类,或者创建一个可以复用但与其他不想换的类或不可预见的类协同工作。此使用规则正体现了对关闭修改扩展开放的原则。

   此模式更多信息请点此

 

   2.外观模式(Facade)

   “为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一个子系统更加容易使用”

结构图:

   使用场合:

      设计初期,应该要有意识的将不同的两个层次分离,层与层之间建立外观Facade;

      开发阶段,子系统往往因为不断的重构演化变得越来越复杂,可增加外观Facade提供一个简单的接口,减少依赖;

      维护一个已经非常难以维护和扩展的遗留大型系统时,可为新系统开发一个外观Facade类,提供简单接口。

 

   3.代理模式(Proxy)

   “为其他对象提供一种代理以控制对这个对象的访问。”

   结构图:

   代理是一种原来对象的代表,其他需要与这个对象打交道的操作都是和这个代表交涉。而适配器则不需要虚构出一个代表者,只需要应付特定使用目的,将原来的类进行一些组合。代理与外观的区别主要在于其代表一个单一的对象,而外观代表一个子系统;代理的客户对象无法直接访问目标对象,而外观对象可直接访问子系统中的各个对象,但通常由外观对象提供对子系统各元件功能的共同层次的简化接口。

   应用场合:远程,为一个对象在不同的地址空间提供局部代表,隐藏一个对象存在于不同地址空间的一个事实。

           虚拟,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。

           安全,控制真实对象的访问权限。

           智能,调用真实的对象时,代理处理另外一些事。

 

   4.桥接模式(Bridge)

   “将抽象部分与它的实现部分分离,使它们都可以独立地变化。”

   结构图:

  

   继承是一种强耦合的关系,父类变,子类就必须要变,因此合成/聚合复用原则中规定“尽量使用合成/聚合,尽量不要使用类继承。”,这样有助于保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小的规模,并且不太可能增长为不可控制的庞然大物。

   实现系统可从多个角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。

 

   5.装饰模式(Decorator)

   “动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。”

   结构图:

 

   应用场合:当系统需要新功能的时候,是向旧的类中添加新的代码,这些新加的代码通常装饰了原有类的核心职责或主要行为。而该模式的优点正是把类中的装饰功能从类中搬移去除,以动态、透明的方式给单个对象添加职责,这样可以简化原有的类。

 

   6.组合模式(Composite)

   “将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。”

   结构图:

  

   透明方式:在Component中声明所有用来管理子对象的方法,其中包括Add、Remove等。这样叶节点和枝节点对于外界就没有区别,它们具备完全一致的行为接口,但在Leaf本身不具备Add()、Remove()方法功能,所以实现它没有意义。

   安全方式:与透明相反,在Component接口中不去声明Add和Remove方法,而是在Conposite声明所有用来管理子类对象的方法。这样由于不够透明,客户端的调用就需要做相应判断,带来不便。

   使用场景:1.需求中是体现部分与整体层次的结构时;

           2.希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑用组合模式。

   优点:组合模式定义了包含基本对象好组合对象的类层次结构。基本对象可以被组合成更复杂的组合对象,而这个复合对象又可以被组合,这样不断地递归下去,客户代码中,任何用到基本对象的地方都可以使用组合对象了。组合模式让客户可以一致地使用组合结构和单个对象。

 

   7.享元模式(Flyweight)

   “为运用共享技术有效地支持大量细粒度的对象。”

   结构图:

  

   享元内部不随环境改变而改变的共享部分称为内部状态,而随环境改变而改变的、不可共享的状态称为外部状态。

   优点:该模式可以避免大量非常相似类的开销。

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

 

作者更多信息

 

 

 

 

 

 

 

 

 

原创粉丝点击