⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simulatingduck.java

📁 几个设计模式的java源码实例
💻 JAVA
字号:
/*
 * 策略模式:定义一族算法,分别封装起来,让它们之间可以互相替换,该模式让算法的变化独立于使用算法的客户
 * 
 * 设计原则1:将应用中可能需要变化之处独立出来,不要就将它们和不需要变化的代码混在一起
 * 设计原则2:针对接口编程,而不是针对实现编程
 * */

//之前可以看看P4的鸭子类的原始继承设计,及可能产生的一些问题

//不同的鸭子的飞行行为不同
interface FlyBehavior{
	public void fly();
}
//叫声也不同
interface QuackBehavior{
	public void quack();
}

//具体的飞行类
class FlyWithWings implements FlyBehavior{
	public void fly(){
		System.out.println("有真翅膀的鸭子的飞行");
	}
}
class FlyNoWay implements FlyBehavior{
	public void fly(){
		System.out.println("翅膀假的,鸭子不会飞");
	}
}
//具体的叫声类
class Quack implements QuackBehavior{
	public void quack(){
		System.out.println("鸭子呱呱叫");
	}
}
class Squeak implements QuackBehavior{
	public void quack(){
		System.out.println("鸭子吱吱叫");
	}
}
class MuteQuack implements QuackBehavior{
	public void quack(){
		System.out.println("鸭子不会叫");
	}
}

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 swim(){	//共同的行为
		System.out.println("所有鸭子都能游泳");
	}
	
	//受益于这种设计,可以动态改变鸭子的行为
	public void setFlyBehavior(FlyBehavior fb){
		flyBehavior =fb; 
	}
	public void setQuackBehavior(QuackBehavior qb){
		quackBehavior =qb; 
	}
}

//具体的鸭子类
class MallardDuck extends Duck{
	public MallardDuck(){
		flyBehavior = new FlyWithWings();
		quackBehavior  = new Quack();
	}
	public void display(){
		System.out.println("一只真正的野鸭子");
	}
}
class ModeDuck extends Duck{
	public ModeDuck(){
		flyBehavior = new FlyNoWay();
		quackBehavior = new MuteQuack(); 
	}
	public void display(){
		System.out.println("一只模型鸭");
	}
}

public class SimulatingDuck {

	public static void main(String[] args) {
		MallardDuck md = new MallardDuck();
		md.display();
		md.performFly();
		md.performquack();
		
		ModeDuck modeDuck = new ModeDuck();
		modeDuck.display();
		modeDuck.performFly();
		modeDuck.performquack();
		modeDuck.setQuackBehavior(new Squeak());
		modeDuck.performquack();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -