设计模式一:策略模式

一.策略模式中用到的设计原则

1.找出代码中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起.
2.针对接口编程,而不是实现编程

二.策略模式

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

2.为什么使用策略模式

如果现在有一个超类Duck(鸭子),该鸭子有飞,叫等行为,现在我们要实现两个子类,这两个子类也要有飞,叫等行为,那我们直接继承此超类Duck即可,但现在需要一个会呱呱叫或者嘎嘎叫的子类,总之和超叫的行为有差异,那我们可以在写一个子类,重写其超类的叫方法,如果还有其它的变化,那么要写很多的子类,非常麻烦。
下面我们使用策略模式来解决
策略模式把其变化的部分和不变的部分分开,上述代码中变化的部分是鸭子的行为,所以我们把鸭子的行为提出来,用接口和实现类的方式来表示。

三.代码

超类:

public  abstract class Duck {
   FlyBehavior flyBehavior;
   QuackBehavior quackBehavior;
   
   public Duck(){
	   flyBehavior = new FlyNoWay();
	   quackBehavior= new Quack();
   }
   
   public void performFly(){
	   flyBehavior.fly();
   }
   
   public void performQuack(){
	   quackBehavior.quack();
   }

public FlyBehavior getFlyBehavior() {
	return flyBehavior;
}

public void setFlyBehavior(FlyBehavior flyBehavior) {
	this.flyBehavior = flyBehavior;
}

public QuackBehavior getQuackBehavior() {
	return quackBehavior;
}

public void setQuackBehavior(QuackBehavior quackBehavior) {
	this.quackBehavior = quackBehavior;
}
   
   
}

飞行为接口:

public interface FlyBehavior {
	public void fly();
}

叫行为接口:

public interface QuackBehavior {
  public void quack();
}

飞行为两个实现类:

public class FlyNoWay implements FlyBehavior {

	@Override
	public void fly() {
		// TODO Auto-generated method stub
   System.out.println("I can't fly");
	}
}

public class FlyWithWings implements FlyBehavior {

	@Override
	public void fly() {
		// TODO Auto-generated method stub
  System.out.println("I'm  fly");
	}

}

叫行为两个实现类:

public class MuteQuack implements QuackBehavior {

	@Override
	public void quack() {
		// TODO Auto-generated method stub
  System.out.println("Mute Quack");
	}

}

public class Quack implements QuackBehavior {

	@Override
	public void quack() {
		// TODO Auto-generated method stub
     System.out.println("quack");
	}

}

子类:

public class MinaDuck extends Duck {
 public static void main(String[] args) {
	//默认的行为
	 MinaDuck  minaDuck= new MinaDuck();
	 minaDuck.performFly();
	 minaDuck.performQuack();
	 //当行为改变时,不需要其重新继承Duck,生成其子类,只要其设置不同的行为即可
	 FlyBehavior flyBehavior = new FlyWithWings();
	 minaDuck.setFlyBehavior(flyBehavior);
	 minaDuck.performFly();
}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值