第九讲:策略模式

Strategy:算法的抽象,比如说加密算法.

ConcreteStrategy:算法的具体实现,比如说MD5加密,或者是MDS加密.

Context是由外部环境决定的,意思是Context是由客户决定的.

//Context持有策略Strategy的引用.....
//你具体要的是哪一个当你调用Context的operation()方法的时候它就给你执行哪一个
//策略模式和装饰模式有点像,同样都是包含对象的引用.
//但是装饰模式是持有引用的类同样实现了接口,但是策略模式里面Context肯定不会去实现Strategy接口.
public class Context {
    
     private  Strategy strategy;

    public Context(Strategy strategy) {
        super();
        this.strategy = strategy;
    }
     public void encrypt(){
         this.strategy.encrypt();//由具体子类来调用加密....
     }
}
public class MainClass {
    public static void main(String[] args) {
/*        Strategy stra   =  new MD5Strategy();//这样就可以实现动态的改变,在客户端改变就可以了.
        //但是这不符合策略模式,策略模式还有一个核心是Context.Context可以看做是工厂,里面包含了Strategy的引用.
        
        stra.encrypt();*/
    
    Context context = new Context(new MD5Strategy());
    context.encrypt();//这里的好处在于是通过Context进行封装的...
    //通过调用encrypt这个方法来执行...
    //客户人员他所关心的是这个Context.而你实际上用的是MD5Strategy
    
    
    
    
    
    }
}
//策略的具体的实现
public class MD5Strategy implements Strategy{

    @Override
    public void encrypt() {
        System.out.println("执行MD5加密");
        
    }
     
}
public class MDSStrategy implements Strategy{

    @Override
    public void encrypt() {
       System.out.println("执行MDS加密");
        
    }

}
//策略抽象类,抽象的接口
public interface Strategy {
       
    //加密
    public void encrypt();
}

 


 

再做一个例子,商家要促销,打八折,或者是满一百送二十,满两百送多少...

package com.ibeifeng.strategy;
//Context是对你的策略的具体的选择
//策略模式对不同的算法/策略是非常好用的.
public class Context {
    private Strategy strategy;//持有策略的引用.

    public Context(Strategy strategy) {
        super();
        this.strategy = strategy;
    }

    public double cost(double num){
        return this.strategy.cost(num);
    }
}
package com.ibeifeng.strategy;

public class MainClass {
    public static void main(String[] args) {
        double num = 200;
        //Context context = new Context(new StrategyA());
        Context context = new Context(new StrategyB());
        //策略模式可以搭配工厂模式,判读选择是new一个对象.工厂模式对于对象的生成是非常方便的.
        //策略模式与工厂模式进行综合的应用
        double newNum = context.cost(num);
        System.out.println("实际付账" +newNum + "元");
        
    }
}
package com.ibeifeng.strategy;
//如果再增加一个策略,只要实现了Strategy接口然后再重写cost方法即可.
public interface Strategy {
     
    public double cost(double num);
    
    
    
}
package com.ibeifeng.strategy;
//打八折
public class StrategyA implements Strategy{

    @Override
    public double cost(double num) {
        return num * 0.8;
        
    }
    
}
package com.ibeifeng.strategy;
//满两百返还五十
public class StrategyB implements Strategy {

    @Override
    public double cost(double num) {
        if(num >= 200){
            return num-50;
        }
        return num;
    }

}

 


 

两种算法的公共部分可以抽取出来.

几个对象它的数据是相同的可以把它共享一下.

策略模式比装饰模式简单多了.装饰模式涉及到给对象添加使用类,策略模式只是持有对象的引用,然后实现你具体的方法.

posted on 2017-04-20 08:22  绿茵好莱坞  阅读(117)  评论(0编辑  收藏  举报

导航