【Java设计模式】· 策略模式(Strategy Pattern)

策略模式:


            1.策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。需要的时候可以灵活地调用方法,也可以对方法(策略)进行修改,客户端调用方法时不需要知道这个方法是怎样实现的。


        2.策略模式区别于访问者模式,解释器模式,状态模式。

               访问者模式里面两个对象(访问者与被访者)之间有相互调用函数,增加一个访问者会比较困难(要连同被访者的几个重载函数一起创建,在被访者类里面也要增加相应的函数),在策略模式里面只要增加一个策略类(并implements Strategy)就可以了。


               解释器模式里面,如四则运算,加法只是解决问题所用到的一条语句,解释器模式根据问题将算法和参与运算的值组合成一个树型结构,非叶子节点(NonterminalExpression)为算法,叶子节点(TerminalExpression)为参与运算的值,最后通过遍历这颗树求得问题的解


               状态模式和策略模式非常相似,将“策略”的切换部分或全部交由“策略”自己处理,这就是状态模式。

Context:环境类,客户端通过它来调用策略方法

Strategy:策略接口

Concrete StategyA/B/C:具体策略类




                3.例子,调用3个方法(策略)


策略类接口,策略方法operate()

package pers.reus.model.strategy.impl;
//策略类接口
public interface Strategy {
	public void operate();
}

三个方法A,B,C

package pers.reus.model.strategy;

import pers.reus.model.strategy.impl.Strategy;

public class StrategyA implements Strategy{
	public void operate() {
		System.out.println("使用策略A");
	}
}


package pers.reus.model.strategy;

import pers.reus.model.strategy.impl.Strategy;

public class StrategyB implements Strategy{
	public void operate() {
		System.out.println("使用策略B");
	}
}

package pers.reus.model.strategy;

import pers.reus.model.strategy.impl.Strategy;

public class StrategyC implements Strategy{
	public void operate() {
		System.out.println("使用策略C");
	}
}

环境类Context。

package pers.reus.model.context;

import pers.reus.model.strategy.impl.Strategy;
//环境类
public class StrategyPatternContext {
	private Strategy strategy;  
    //构造函数,通过传参判断要使用哪个方法  
    public StrategyPatternContext(Strategy strategy){  
         this.strategy = strategy;  
    }  
    public void setStrategy(Strategy strategy){  
         this.strategy = strategy;  
    }  
    public void operate(){  
         this.strategy.operate();  
    }  
}

测试:

package pers.reus.model.client;

import pers.reus.model.context.StrategyPatternContext;
import pers.reus.model.strategy.StrategyA;
import pers.reus.model.strategy.StrategyB;
import pers.reus.model.strategy.StrategyC;

public class StrategyPatternClient {

	public static void main(String[] args) {
	    //声明Context
	    StrategyPatternContext context; 
		
	    //讲A,B,C三个策略分别放入Context
	    context = new StrategyPatternContext(new StrategyA());
	    context.operate();
	    
	    context = new StrategyPatternContext(new StrategyB());
	    context.operate();
	    
	    context = new StrategyPatternContext(new StrategyC());
	    context.operate();
	}

}

结果:

使用策略A
使用策略B
使用策略C


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值