设计模式一:策略模式

定义:策略模式定义了算法族(每个行为的实现都是算法,合起来就是算法族),分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

设计原则:

1、找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要的变化的代码混在一起

2、针对接口编程,而不是针对实现编程(利用多态)

3、多用组合,少用继承

每一个鸭子都有一个FlyBehavior和QuackBehavior,可以将飞行和呱呱叫的行为都委托给它们处理。

当两个类结合起来使用,就是组合。这种和继承的不同在于,鸭子的行为不是继承来的,而是和适当的行为对象“组合”来的。

Duck类:

Duck.java
package com.sun;

public abstract class Duck {
	/*
	 * 下面两个类属于变化的部分
	 */
  //飞的类
  FlyBehavior flyBehavior;
  //叫的类
  QuackBehavior quackBehavior;
  public Duck(){
	  
  }
  public abstract void display();
  
  public void performFly(){
	  //委托给行为类
	  flyBehavior.fly();
  }
  
  public void performQuack(){
	  //委托给行为类
	  quackBehavior.quack();
  }
  /*
   * 增加另个新方法,实现动态设定行为
   */
  public void setFlyBehavior(FlyBehavior fb){
       //会通过接口(多态的表现形式之一)行为改变为相应的飞行行为(调用相应行为的方法)
	  flyBehavior = fb;
  }
  public void setQuackBehavior(QuackBehavior qb){
	  quackBehavior = qb;
  }
  public void swim(){
	  System.out.println("All ducks float,even decoys!");
  }
  
}

MallardDuck类:

package com.sun;

public class MallardDuck extends Duck{
  
	public MallardDuck(){
		//是对MallardDuck的具体实现
		quackBehavior = new Quack();
		flyBehavior = new FlywithWings();	
		
	}
	public void display(){
		System.out.println("I'm a real Mallard duck");
	}
}

ModelDuck类:

package com.sun;

public class ModelDuck extends Duck {
    
	public ModelDuck(){
		//通过具体实现测试,静态设定行为
		flyBehavior = new FlyNoWay();
		quackBehavior = new Quack();
	}
	
	public void display() {
		System.out.println("I'm a model duck");

	}

}

飞的行为接口

package com.sun;


/*
 * 飞的行为类
 */
public interface FlyBehavior {
  public void fly();
}

以下是飞的接口的三个实现类:

package com.sun;

public class FlyNoWay implements FlyBehavior {

	public void fly() {
		System.out.println("i can't fly!!");
	}

}

package com.sun;

public class FlyRocketPowered implements FlyBehavior {

	public void fly() {
		System.out.println("I'm fly with a rocket!");

	}

}

package com.sun;

public class FlywithWings implements FlyBehavior {

	public void fly() {
		System.out.println("I'm flying!!");

	}

}

QuackBehavior行为的接口:

package com.sun;

/*
 * 叫的行为类
 */
public interface QuackBehavior {
  public void quack();
}

以下是QuackBehavior接口的实现类:

package com.sun;

public class Quack implements QuackBehavior {

	public void quack() {
		System.out.println("quack!!");
	}
}

package com.sun;

public class Squeak implements QuackBehavior {

	public void quack() {
		System.out.println("quack");
	}

}
package com.sun;

public class MuteQuack implements QuackBehavior {

	public void quack() {
		System.out.println("<<>silence>");
	}
	

}

测试类:

package com.sun;

/*
 * 测试类
 */
public class MiniDuckSimulator {
	  public static void main(String[] args) {
		//静态设定行为
		Duck mallard = new MallardDuck();
		mallard.performQuack();
		mallard.performFly();
		
		/*
                 动态设定行为,通过在Duck中增加两个set方法
                 在运行时想改变鸭子的行为,只需调用鸭子的setter方法就可以
                */
		Duck model = new ModelDuck();
		model.performFly();
		model.setFlyBehavior(new FlyRocketPowered());
		model.performFly();
		
	}
}

 

转载于:https://my.oschina.net/u/3723612/blog/1613730

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值