坚持着客户端代码是程序的入口,构造函数是类的入口为原则,对模式理解整理:
【策略模式】
策略模式(Strategy)是定义一系列算法的方法,所有的算法功能相同,但是实现不同。
如上图,策略类strategy是算法类基类,context(上下文)负责具体实例化算法,使用上可以与简单工厂相结合,将选择成分(switch)注入该类中。
实现理解(从客户端理解):
1)实例化context类:Context context =new Context(new ConcreteStrategyA())
目的:获得具体的算法类
思考:(a)context主要负责安装具体的策略类,它是通过strategy类来实现的。因此考虑在context的构造函数中应该将strategy传进去。
(b)由于context一次只能实例化一个具体的算法类,为减少让客户端判断选择具体算法类,考虑将简单工厂模式添加到里面context里面(构造函数),客户端只要输入具体的算法就可以了 Context a=new Context(A)
switch(type)
{
case “A”:
ConcretestragyA A=new ConcretestragyA();
break;
case “B”
……;
}
2)策略实现,通过context的接口函数来调用 :context.contextInterface();
思考:为什么要用context类来实现具体策略,这样做的好处?
这样做客户端代码实现只采用了context一个类,不需要知道具体的策略类是如何连接的,也不用管策略中的实现方法是如何运作的,降低耦合性;客户只需要给context中传入实现具体类所需要的数据成员即可,只需要知道context类的用法即可!
缺点:switch语句调用具体策略类,无论添加或者修改都要重新修改context类,有修改就需要成本!
3)总结:
策略模式是一种调用封装算法的方法,当一个程序运用到的算法功能相同,但是具体内容实现不同时就考虑采用策略模式,策略模式通过虚接口方法来实现,基类中定义虚方法,子类重写(注意返回值,或者直接输出),context类调用。
【装饰模式】
装饰模式(Decorator)将核心功能与装饰功能分开,这样就可以动态添加功能了!
人都是爱美的,把人看做最初的代码原型(组件 component),必然要穿衣服(decorator),不断更换衣服样式就是一种动态添加新功能的过程;一个程序中最初组件是功能代码的话,可以将添加背景,改变字体等操作看做是一种装饰,让操作更加简便有效
实现过程(客户端代码入手):
1.实例化最初组件:提供最初母体。ConcreteComponent c=new ConcreteComponent
思考:提供的初级组件类中,装饰者应该通过什么方法来装饰它?
说明:将最初组件作为基类(可以为抽象类也可以是具体类),并提供虚拟展示(operation)方法,继承子类通过重写展示方法实现装饰过程
2.实例化各组件
3.具体装饰过程(迭代式装饰),必须保证一个装饰完成以后,第二个再装饰不会影响先前的装饰,而是以上一次的装饰完成后作为基本组件进行的!
思考:如何实现这样的迭代装饰?
首先创建一个抽象的装饰者(detector)类,继承最初组件类,定义装饰方法Decorate(),重写展示方法Show()(实现实例化的最初组件);具体装饰者(detector子类)重写装饰方法,实现过程中执行父类detector的show()方法。
装饰过程,是分先后顺序的,基本组件装饰一个detector后,又重新作为基本组件:
例如:sneakers.Decorate(Person) ;//为人穿上T恤,此时T恤又重新作为了基本组件
bigtrouser.Decorate(sneakers); //为上面的组件添加
缺点:1.装饰模式代码实现较为复杂
2.必须注意顺序问题,就好比一个人不能将内衣穿在外衣外面。解决的方法必须保证各个具体装饰类之间 保持独立。
【代理模式】
代理模式(Proxy),提供了一种通过代理来控制访问对象的权限。
实现过程:
1.定义基类,提供抽象要求方法request()
2.真正的操作类继承基类,重写实现要求方法request()
3.定义代理类继承基类,重写要求类,通过调用真实的request()方法来最终实现
对代理的远程,虚拟,安全和智能指引方面的应用理解不是很深刻,单从代理这个词义上理解,真实的操作通过代理去完成,对真实操作类可以起到隐藏和保护作用。
【总结】
每一个设计模式都是一把双刃剑,存在便利的同时也存在着缺陷,学会如何利用模式的优势,弥补模式的缺陷也是一项值得思索的问题!