您的位置:首页 > 其它

(一)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函数设置进来即可,这样基类中再增加方法,非常容易改动。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: