通俗易懂的JAVA设计模式之策略模式

策略模式解决的问题

策略模式定义了一系列算法,也可以称之为解决方案,并将每一个方法封装起来,使他们可以相互替换,让算法独立于使用他的客户而变化。这样的话就可以解决在编码时使用大量if else的问题,如果在一个条件语句中又嵌套了多个条件语句,就会使代码变得臃肿,维护成本也加大,策略模式可以很好的解决这个问题。

策略模式使用场景

1.针对同一类型问题的多种处理方式,仅仅有具体行为差异时

2.需要安全的封装多种同一类型的操作时

3.同一个抽象类有多个子类,而又需要使用if-else或者switch-case来选择具体子类时

策略模式角色

环境角色(context):持有一个Strategy的引用

抽象策略角色(strategy):这是一个抽象角色,通常由接口或者抽象类实现。次角色给出所有的具体侧罗所需的接口。

具体策略角色(concreteStrategy):包装了相关的算法和行为

简单策略模式代码模板

抽象策略类

//抽象策略类
public interface Strategy{
	//策略方法
	public void strategyInterface();
}

具体策略类

//具体策略类
public class ConcreteStrategyA implements Strategy{
	
	@Override
	public void strategyInterface(){
		//具体策略方法
	}
}

//具体策略类
public class ConcreteStrategyB implements Strategy{
	
	@Override
	public void strategyInterface(){
		//具体策略方法
	}
}

环境角色类

//环境角色类
public class Context {
    //持有一个具体策略的对象
    private Strategy strategy;
    /**
     * 构造函数,传入一个具体策略对象
     * @param strategy    具体策略对象
     */
    public Context(Strategy strategy){
        this.strategy = strategy;
    }
    /**
     * 策略方法
     */
    public void contextInterface(){

        strategy.strategyInterface();
    }

}

举个比较简单的例子,冲q币的时候会员是97折,超级会员是92折。那么这就是两种策略。下面用代码实现。

1.创建一个计算价格的策略接口

public interface CalPrice(){
	//计算价格的方法
	DOuble returnPrice(Double QNum);
}

2.创建两个具体的价格计算策略

public class Vip implements CalPrice(){
	
	@Override
	Double returnPrice(Double QNum){
		return QNum * 0.97;
	}
}

public class SVip implements CalPrice(){
	
	@Override
	Double returnPrice(Double QNum){
		return QNum * 0.92;
	}
}

3.创建一个用户角色,带有冲q币的功能

public class Player{
	private CalPrice calPrice;
	
	public SetVip(CalPrice calPrice){
		this.calPrice = calPrice;
	}
	
	public void returnPrice(Double QNum){
		calPrice.returnPrice(Double QNum);
	}
}

4.使用方法


public static void main(String[] args){
	Player player = new Player();
	player.setVip(new SVip);
	player.returnPrice(12);
}

总结

通过将冲值q币的方法独立出来,实现了用户和身份的松耦合,可以动态的改变角色的身份,同时将冲q币的方法委托给了CalPrice类去执行,角色类不在实现具体的冲q币的方法,这也是一种组合的概念,符合多用组合,少用继承的设计原则(角色的冲q币方式不是继承来的,而是和CalPrice 组合来的)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值