`
Thomas会Coding
  • 浏览: 93579 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

策略模式

阅读更多

1:策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

设计原则:① :找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

②:针对接口编程,而不是针对实现编程。

③:多用组合,少用继承。

针对接口编程,关键就在于多态,利用多态,程序可以针对超类型编程,执行时会根据实际状况执行到真正的行为,不会被绑死在超类型的行为上。

 

将程序中变化的部分定义成一个接口,每种不同的变化都作为接口的具体实现子类。如果某一个类需要这种变化的模块,就可将其接口作为此类的一个属性,从而达到使用变化类的目的。这种设计,可以很方便的对程序进行更新,因为一开始就把变化的部分提取出来了。

 

例如要设计一个Duck类,每个鸭子的外表Display()是不同的,但是都有,所以设计成抽象方法,每个鸭子都会游泳Swim()。所以在超类中就实现。对于飞行和叫的行为,每种鸭子各不一样,比如有的会飞,有的不会飞,有的会叫,有的不会叫,叫声又各不相同,所以将鸭子的飞行和叫的行为设计为接口。对于每种不同的飞行或者叫设计为具体的实现子类,利用组合的方式添加到鸭子中。

 

public abstract class Duck {
	FlyBehavior flyBehavior;//组合
	QuarkBehavior quarkBehavior;
	public abstract void display();
	public void swim(){
		System.out.println("I can swim");
	}
	public void performQuark(){
		quarkBehavior.quark();
	}//针对接口编程
	public void performFly(){
		flyBehavior.fly();
	}
	public void setFlyBehavior(FlyBehavior fb){
		flyBehavior=fb;
	}//可以动态改变
	public void setQuarkBehavior(QuarkBehavior qb){
		quarkBehavior=qb;
	}
}
 
public interface FlyBehavior {
	public abstract void fly();
}

 

public interface QuarkBehavior {
	public abstract void quark();
}

 

public class Quark implements QuarkBehavior{
	public void quark(){
		System.out.println("I can quark.");
	}
}
public class MuteQuark implements QuarkBehavior{
	public void quark(){
		System.out.println("I can not quark.");
	}
}

 

public class FlyWithWings implements FlyBehavior{
	public void fly(){
		System.out.println("I can fly with wings");
	}
}
public class FlyWithNoWings implements FlyBehavior{
	public void fly(){
		System.out.println("I can not fly with wings");
	}
}

 

public class RedHeadDuck extends Duck{
	public RedHeadDuck(){
		flyBehavior=new FlyWithWings();
		quarkBehavior=new Quark(); 
	}
	public void display(){
		System.out.println("I am a red head duck");
	}
}

 

public class Test {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Duck duck=new RedHeadDuck();
		duck.display();
		duck.swim();
		duck.performQuark();//会叫
		duck.performFly();//会飞
		duck.setFlyBehavior(new FlyWithNoWings());//不会飞
		duck.setQuarkBehavior(new MuteQuark());//不会叫
	}

}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics