(一)23种设计模式的理解之我见------策略模式(Strategy Pattern)
2012-03-15 21:17
429 查看
策略模式:引用经典书籍《设计模式》中的一句话来对此设计模式进行定义:定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换。该模式使得算法可独立于它们的客户变化。初次看到这个定义就产生了疑问,为什么要把这些算法进行封装?后来又查阅了相关的资料,得到了答案。我们来举例说明这个问题。假设有一个人这个基类,还有一些类为学生,教师,和工人,假设有这三个子类分别继承自此人这个基类。人里面有好多方法,比如说走,说话,工作.....等等这几个方法,走这个方法是所有继承自人的这个基类的类的共有的方法,而说话这个方法,每个人根据不同学历背景都会说出不同的话来,工作根据不同的工种,你也做出不同的工作....等等吧,就不再举例子了。对于共通的方法我们可以继承,而对与这些针对不同类有不同的方法,我们可能想到的一个最好的解决方案就是覆写。这样便会产生一个问题,我在基类里每增加一种这样的方法,各个子类就要跟着覆写,工作量过于庞大。看到策略模式,我感觉是一种非常好的方法来解决此种问题。废话不多说上代码!
//这个是基类,我定义了一个交通工具的基类,并定义了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函数设置进来即可,这样基类中再增加方法,非常容易改动。
相关文章推荐
- 23种设计模式(12):策略模式
- 23种设计模式(12):策略模式
- Java 23种设计模式之策略模式
- 走穿java23种设计模式--16策略模式详解
- 23种设计模式之策略模式
- java 23种设计模式 深入理解
- java 23种设计模式 深入理解
- 23种设计模式(12):策略模式
- java 23种设计模式 深入理解
- 23种设计模式(12):策略模式
- 23种设计模式的通俗理解
- Java23种设计模式之策略模式
- 我所理解的设计模式(C++实现)——策略模式(Strategy Pattern)
- 浅谈java 23种设计模式之策略模式(Strategy Pattern)
- 23种设计模式的通俗理解
- Java开发中的23种设计模式详解----策略模式(strategy)
- 深入理解JavaScript系列(33):设计模式之策略模式(转)
- Java 23种设计模式 深入理解
- java 23种设计模式 深入理解
- 23种设计模式的理解