(一)23种设计模式的理解之我见------策略模式(Strategy Pattern)

本文通过一个具体的实例详细介绍了策略模式的设计思想及其应用场景。策略模式允许在运行时选择算法,通过将算法封装成独立的对象,实现算法的灵活切换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      策略模式:引用经典书籍《设计模式》中的一句话来对此设计模式进行定义:定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换。该模式使得算法可独立于它们的客户变化。初次看到这个定义就产生了疑问,为什么要把这些算法进行封装?后来又查阅了相关的资料,得到了答案。我们来举例说明这个问题。假设有一个人这个基类,还有一些类为学生,教师,和工人,假设有这三个子类分别继承自此人这个基类。人里面有好多方法,比如说走,说话,工作.....等等这几个方法,走这个方法是所有继承自人的这个基类的类的共有的方法,而说话这个方法,每个人根据不同学历背景都会说出不同的话来,工作根据不同的工种,你也做出不同的工作....等等吧,就不再举例子了。对于共通的方法我们可以继承,而对与这些针对不同类有不同的方法,我们可能想到的一个最好的解决方案就是覆写。这样便会产生一个问题,我在基类里每增加一种这样的方法,各个子类就要跟着覆写,工作量过于庞大。看到策略模式,我感觉是一种非常好的方法来解决此种问题。废话不多说上代码!

//这个是基类,我定义了一个交通工具的基类,并定义了display方法展现变通的方法,定义set方法设置方法
public abstract class vehicle {
	protected LoadPeopleBehavior lpb;
	protected LoudSpeakerBehavior lsb;
	public String run(){
	return "因为我是交通工具所以我会跑!";
   }
	public String DisplayLoad(){
		return lpb.loadperson();
	}
	public String Displaytrump(){
		return lsb.trump();
	}
	
	public void SetLoad(LoadPeopleBehavior lpb){
		this.lpb=lpb;
	}
	public void SetTrump(LoudSpeakerBehavior lsb){
		this.lsb=lsb;
	}
	public String toString(){
		return this.run();
	}
	public String description(){
		return null;
	}
//自行车子类
public class Bike extends vehicle{
   public Bike(){
	   super.SetLoad(new BikeLoadPerson());
   	super.SetTrump(new NoEletrictrump());
   }
	public String description(){
	return "我是一辆自行车";
	}
}
//公共汽车子类
public class Bus extends vehicle{
 public Bus(){
	 super.SetLoad(new BusLoadPerson());
	   	super.SetTrump(new HaveEletrictrump());
 } 
 public String description(){
	  return "我是一辆公共汽车!";
  }
}


}
//小汽车子类
public class Car extends vehicle{
    public Car(){
    	super.SetLoad(new CarLoadPerson());
    	super.SetTrump(new HaveEletrictrump());
    }
	public String description(){
	  return "我是一辆小汽车" ;
	  }
  
}
//将共通的载人方法抽出来
public interface LoadPeopleBehavior {
   public String loadperson();
}
//将共通的喇叭叫方法抽出来
public interface LoudSpeakerBehavior {
    public String trump();
}
//以下是各个具体的方法都不做注释了
public class BusLoadPerson implements LoadPeopleBehavior{

	public String loadperson() {
		
		return "可以载很多人";
	}

}
public class CarLoadPerson implements LoadPeopleBehavior {

	public String loadperson() {
		
		return "可以载4个人";
	}

}
public class BikeLoadPerson implements LoadPeopleBehavior {

	public String loadperson() {
		return "可以载两个人";
	}

}
public class HaveEletrictrump implements LoudSpeakerBehavior {

	public String trump() {
		return "有电子喇叭可以叫";
	}

}
public class NoEletrictrump implements LoudSpeakerBehavior{

	public String trump() {
		return "没有电子喇叭不能叫";
	}

}
//主函数
public class Main {

	public static void main(String[] args) {
		Car car=new Car();
		Bus bus=new Bus();
		Bike bike=new Bike();
		
		System.out.println(car.description()+"@"+car+"@"+car.DisplayLoad()+"@"+car.Displaytrump());
		System.out.println(bike.description()+"@"+bike+"@"+bike.DisplayLoad()+"@"+bike.Displaytrump());
		System.out.println(bus.description()+"@"+bus+"@"+bus.DisplayLoad()+"@"+bus.Displaytrump());

	}

}
关于这几个类,我定义了一个基类vehicle和三个子类bike,bus,car,三个子类中有一样的方法就是可以run,而trump和loadperson根据不同的类有不同的方法,所以我们将这两个方法封装起来作统一的定义,然后在具体的类中需要哪个方法调用set函数设置进来即可,这样基类中再增加方法,非常容易改动。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值