zoukankan      html  css  js  c++  java
  • 策略模式

    下面是我的阅读笔记

    策略模式
    面对对象的编程,并不是类越多越好,类的划分是为了封装,但是分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。

    策略模式
    它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

    策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有算法,较少各种算法类与使用算法类之间的耦合[DPE]。

    策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法中的公共功能[DP]。
    另外一个策略模式的有点事简化单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试[DPE]。
    策略模式就是封装算法的,但是在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同实践应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。

    ————————————————————————————————————————————————————————————————————————————————————————————————

    举个例子来说明一下我的理解。

    比如说回家这件事。实现回家的方式有很多:火车、汽车、飞机等。但是对于用户来说,不管是哪种方式最后都能够帮助我们回家。

    策略模式就是将这三种方式的共性提取出来,成为一个抽象方法或接口,里面有每个出行方式都需要实现的方法(这里是出行方式)。

    再通过多态的方式,来调用具体的方法。

    就这个例子而言,首先是创建一个Transportation接口,如下:

    package com.gohome.transport;
    
    public interface Transportation {
        public void gohome();
    }

    然后是分别创建对应的出行方式类,这里以Airplane为例

    package com.gohome.transport;
    
    public class Airplane implements Transportation{
    
        @Override
        public void gohome() {
            // TODO Auto-generated method stub
            System.out.println("go home by airplane");
        }
    
    }

    然后是context类。这个类里面使用了简单工厂模式根据客户端输入的字符串创建对应的实例。

    并且在这个类中定义了一个回家方法,里面调用回家需要用到的方法。

    package com.gohome.context;
    
    import com.gohome.transport.Airplane;
    import com.gohome.transport.Bus;
    import com.gohome.transport.Train;
    import com.gohome.transport.Transportation;
    
    public class TransportContext {
        Transportation transportation;
        
        public TransportContext(String type){
            Transportation transport = null;
            switch (type) {
            case "火车":
                transport = new Train();
                break;
            case "汽车":
                transport = new Bus();
                break;
            case "飞机":
                transport = new Airplane();
                break;
            default:
                break;
            }
            this.transportation = transport;
        }
        
        public void goHome(){
            transportation.gohome(); 
        }
        
    }

    最后是在客户端测试。测试代码如下:

    package com.gohome.test;
    
    import com.gohome.context.TransportContext;
    
    public class Test {
    
        public static void main(String[] args){
            TransportContext context ;
            context = new TransportContext("火车");
            context.goHome();
            
            context = new TransportContext("汽车");
            context.goHome();
            
            context = new TransportContext("飞机");
            context.goHome();    
            
        }
        
    }

    在客户端,用户并不知道在它输入不同的字符串的时候,服务端已经使用了不同的算法来满足他的需求。这就是策略模式。

    源码

  • 相关阅读:
    android SQLiteDatabase数据库使用的时候 常见问题
    ArrayList与LinkedList的基本添加删除方法 模拟栈 队列
    ImageView小技巧
    TextView 小技巧
    悬浮窗
    帧动画布局文件 animation-list
    VideoView的全屏问题
    FragmentPagerAdapter与FragmentStatePagerAdapter区别
    观察者模式 DataObserver
    vue中filter的用法
  • 原文地址:https://www.cnblogs.com/cuglkb/p/6861983.html
Copyright © 2011-2022 走看看