设计模式--策略模式,装饰模式

            坚持着客户端代码是程序的入口,构造函数是类的入口为原则,对模式理解整理:

 【策略模式】

           策略模式(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()方法来最终实现
         对代理的远程,虚拟,安全和智能指引方面的应用理解不是很深刻,单从代理这个词义上理解,真实的操作通过代理去完成,对真实操作类可以起到隐藏和保护作用。

【总结】

         每一个设计模式都是一把双刃剑,存在便利的同时也存在着缺陷,学会如何利用模式的优势,弥补模式的缺陷也是一项值得思索的问题!

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值