设计模式 - 策略模式

模式设计图:

这里写图片描述

代码示例:

/**
 * 首先定义一个策略接口,锦囊妙计的接口。
 */
public interface IStrategy {
    //每个锦囊妙计都是一个可执行的算法。
    public void operate();
}
/** 
 * 策略1 
 */  
public class Strategy1 implements IStrategy {  

    @Override  
    public void operate() {  
        System.out.println("策略1");  
    }  

} 
/** 
 * 策略2 
 */  
public class Strategy2 implements IStrategy {  

    @Override  
    public void operate() {  
        System.out.println("策略2");  
    }  

} 
/** 
 * 策略3 
 */  
public class Strategy3 implements IStrategy {  

    @Override  
    public void operate() {  
        System.out.println("策略3");  
    }  

} 
/** 
 * 定义一个锦囊用于存放妙计
 */  
public class Context {  

    private IStrategy strategy;  
    //构造函数,要你使用哪个妙计  
    public Context(IStrategy strategy){  
        this.strategy = strategy;  
    }  

    public void operate(){  
        this.strategy.operate();  
    }  

}  
/** 
 * 使用锦囊妙计
 */  
public class Main{  

    public static void main(String[] args) {  
        Context context;  

        context = new Context(new Strategy1());  
        context.operate();//拆开执行  
        System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");  

        context = new Context(new Strategy2());  
        context.operate();//拆开执行  
        System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");  

        context = new Context(new Strategy3());  
        context.operate();//拆开执行  
        System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");  
    }  

}  

策略模式的优点

  (1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。

  (2)使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。

策略模式的缺点

  (1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。

  (2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值