大话设计模式 二

来源:互联网 发布:淘宝怎么申请介入处理 编辑:程序博客网 时间:2024/05/26 22:07
 第十一章

迪米特法则(最少知识原则

优点:   类间解耦,弱耦合,只有弱耦合了以后,类的复用性才可以提高。

根本思想:   强调类之间的松耦合。

前提:   在类的结构设计中,每一个类都应尽可能降低成员的访问权限。

一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。

一个软件实体应当尽可能少的与其他实体发生相互作用。

 

 

第十二章

代码功能:股民炒股或投资过程

   

1.       股民通过投资基金的方式实现股票购买卖出。

2.       外观模式

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

使用场景:

    (1)设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。

(2) 开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。

(3) 维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。

优点:

    (1)实现了子系统与客户端之间的松耦合关系。

(2)客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。

 

 

第十三章

代码功能:画一个小人

注意事项:

1. 不要落掉人的手或腿

   

1.建造者模式

将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

使用场景:

1.创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化。

2.要创建的复杂对象的算法,独立于该对象的组成部分,也独立于组成部分的装配方法时。

      优点:

1.使用建造者模式可以使客户端不必知道产品内部组成的细节。

2.具体的建造者类之间是相互独立的,对系统的扩展非常有利。

3.由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。

 

 

第十四章

代码功能:写一个前台帮忙监察老板动态的情况

注意事项:

1.       类之间耦合不应太多

2.       满足依赖倒转原则

   

1.       观察者模式

有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

使用场景:

1.当一个对象的改变需要给变其它对象时,而且它不知道具体有多少个对象有待改变时。

2.一个抽象某型有两个方面,当其中一个方面依赖于另一个方面,这时用观察者模式可以将这两者封装在独立的对象中使它们各自独立地改变和复用。

优点:

观察者模式解除了主题和具体观察者的耦合,让耦合的双方都依赖于抽象,而不是依赖具体。从而使得各自的变化都不会影响另一边的变化。

2.       事件委托

委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法有相同的行为。委托方法可以像其它任何方法一样,具有参数和返回值。委托可以看作是对函数(方法)的的抽象,是函数的“类”,委托的实例代表一个(或多个)具体的函数,它可以是多播的。

委托对象所搭载的所有方法必须具有相同的原型和形式。

 

第十五章

代码功能:便于更换数据库的程序

注意事项:

1.       类之间耦合不应太多

   

1.       抽象工厂模式

为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类

使用场景:

当需要创建的对象是一系列相互关联或相互依赖的产品族时

优点:

   可以在类的内部对产品族进行约束

 

2.       反射

Using system.Reflection

Assembly.Load(“程序集名”).CreateInstance(“命名空间.类名”)

3.       配置文件

配置文件:

<?xml version="1.0"  encoding="utf-8" ?>

<configuration>

  <appSettings>

    <add key="factory" value="Demo.CarFactory"/>

  </appSettings>

</configuration>

代码:

string factoryStr =  ConfigurationManager.AppSettings["factory"];

cf =  Assembly.Load("Demo").CreateInstance(factoryStr);

 

第十六章

代码功能:根据时间的不同,做出判断来实现

注意事项:

1.       方法不应太长

   

1.       状态模式

主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。

优点

状态模式将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。

所有状态相关的代码都存在于某个ConcereteState中,所以通过定义新的子类很容易地增加新的状态和转换。

状态模式通过把各种状态转移逻辑分不到State的子类之间,来减少相互间的依赖。

缺点

导致较多的ConcreteState子类

适用场景

当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式来。

一个操作中含有庞大的分支结构,并且这些分支决定于对象的状态。

 

 

第十七章

代码功能:教练给不同位置人分配进攻防守任务的代码

   

1.       适配器模式

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

优点

通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。这样做更简单、更直接、更紧凑。

复用了现存的类,解决了现存类和复用环境要求不一致的问题。

将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码。

一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。

缺点

对于对象适配器来说,更换适配器的实现过程比较复杂。

适用场景

系统需要使用现有的类,而这些类的接口不符合系统的接口。

想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

两个类所做的事情相同或相似,但是具有不同接口的时候。

旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候。

使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。

 

 

第十八章

代码功能:存储角色生命力,攻击力,防御力的数据

   

1.       备忘录模式

在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

优点

有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取,这时,使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界。

本模式简化了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需要的这些状态的版本。

当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。

缺点:

如果发起人角色的状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象会很昂贵。

当负责人角色将一个备忘录 存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否很昂贵。

当发起人角色的状态改变的时候,有可能这个协议无效。如果状态改变的成功率不高的话,不如采取"假如"协议模式。

 

 

第十九章

代码功能:公司统一对分公司管理

   

1.       组合模式

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

使用场景:

用于对象的部分-整体层次结构,如树形菜单、文件夹菜单、部门组织架构图等;

对用户隐藏组合对象与单个对象的不同,使得用户统一地使用组合结构中的所有对象。

优点:

组合模式可以很容易的增加新的构件。

使用组合模式可以使客户端变的很容易设计,因为客户端可以对组合和叶节点一视同仁。

缺点:

使用组合模式后,控制树枝构件的类型不太容易。

用继承的方法来增加新的行为很困难。

 

 

第二十章

代码功能:乘车买票

   

1.       迭代器模式

提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。

使用场景:

访问一个聚合对象的内容而无需暴露它的内部表示

支持对聚合对象的多种遍历

为遍历不同的聚合结构提供一个统一的接口

优点:

简化了遍历方式,对于对象集合的遍历,还是比较麻烦的,对于数组或者有序列表,我们尚可以通过游标来取得,但用户需要在对集合了解很清楚的前提下,自行遍历对象,但是对于hash表来说,用户遍历起来就比较麻烦了。而引入了迭代器方法后,用户用起来就简单的多了。

可以提供多种遍历方式,比如说对有序列表,我们可以根据需要提供正序遍历,倒序遍历两种迭代器,用户用起来只需要得到我们实现好的迭代器,就可以方便的对集合进行遍历了。

封装性良好,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心。

    缺点:

对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐,大家可能都有感觉,像ArrayList,我们宁可愿意使用for循环和get方法来遍历集合。

0 0
原创粉丝点击