设计模式 策略模式轻谈

需求

使用策略模式,模拟火车上的盒饭价格(好几年没坐火车,不知道现在的定价如何…………)

 

定义interface,作为抽象策略

此接口规范了用于制定盒饭价格的能力,称为抽象策略接口

interface SalePriceMode {
	public abstract double makePrice();
}

 

富人模式类,产生的对象将作为第一个实际策略

class RicherManMode implements SalePriceMode{
	@Override
	public double makePrice() {
		return 20.0;
	}
}

 

中产模式类,产生的对象作为第二个实际策略

class OrdinaryManMode implements SalePriceMode{
	@Override
	public double makePrice() {
		return 10.0;
	}
}

 

屌丝模式类,产生的对象将作为第三个实际策略

class DiaosiManMode implements SalePriceMode{
	@Override
	public double makePrice() {
		return 5.0;
	}
}

 

列车员类产生的对象,负责持有策略对象,会根据不同的具体策略对象调用makePrice()方法


class TrainAtt {
	SalePriceMode msMode;  //持有一个盒饭制定价格对象(即持有一个策略对象)
	public TrainAtt(SalePriceMode msMode) {
		this.msMode = msMode;
	}
	
	public void setSaleMode(SalePriceMode saleMode) {
		msMode = saleMode;
	}
	
	public void showPrice() {
		System.out.println("盒饭价格是:" + msMode.makePrice());
	}
}

 

程序入口Main类

public class Main {
	public static void main(String args[]) {
		SalePriceMode richerMan = new RicherManMode(); //创建第一个策略对象(富人)
		System.out.print("饭点 -");
		TrainAtt att = new TrainAtt(richerMan); //列车员首先使用富人定价策略
		att.showPrice(); 
		System.out.print("过了饭点-");
		SalePriceMode ordinaryMan = new OrdinaryManMode();  //创建第二个策略对象(中产)
		att.setSaleMode(ordinaryMan); //改变价格,列车员使用中产定价策略
		att.showPrice();
		System.out.print("没人吃了-");
		SalePriceMode diaosiMan = new DiaosiManMode();  //创建第三个策略对象(屌丝)
		att.setSaleMode(diaosiMan); //改变价格,列车员使用屌丝定价策略
		att.showPrice();
	}
}

 

输出结果

饭点 -盒饭价格是:20.0
过了饭点-盒饭价格是:10.0
没人吃了-盒饭价格是:5.0

 

策略模式的好处(专门替代if else……)

1、代码可扩展性好

以上文为例,当需要增加一个新的定价,只需要再写一个类即可,方便实现动态替换

2、代码可维护性好

代码都写在单独的类中,更容易维护(实际工作中,方法一般都很长)

 

不使用策略模式的列车员类


class TrainAtt {
	public void showPrice(int mode) {
        double price = 0;
        if (mode == 0) {
            price = 20.0;
        } else if (mode == 1) {
            price = 10.0;
        } else if (mode == 2) {
            price = 5.0;
        }
		System.out.println("盒饭价格是:" + price);
	}
}

 

使用策略模式的最佳时机

1、if else 嵌套很多,条件判断语句来选择不同的实现方案

2、switch case很多,也是条件判断语句来选择不同的实现方案

3、接口、或者抽象类,有个方法里面使用if else、switch case语句选择使用不同的子类

4、想办法找公共代码,把if else、switch case干掉!

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值