设计模式之策略模式

本文通过鸭子游戏案例介绍了策略模式的应用,展示了如何通过定义算法族并封装它们来实现灵活的行为替换,以此达到良好的代码扩展性和维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.设计模式之策略模式: 

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

参考书籍《Head First设计模式》






Duck类所有种类的鸭子的父类代码:

package com.wukung.blog;

public abstract class Duck {
	FlyBehavior flyBehavior;
	QuackBehavior quackBehavior;
	
	public Duck(){
	
	}
	
	public void performFly(){
		flyBehavior.fly();
	}
	
	public void performQuack(){
		quackBehavior.quack();
	}
	
	//动态的设置叫的方式
	public void setQuackBehavior(QuackBehavior q){
		quackBehavior = q;
	}
	
	//动态的设置飞的方式
	public void setFlyBehavior(FlyBehavior f){
		flyBehavior = f;
	}
	
	public abstract void display();
	
}


所有飞行行为类必须实现的接口:

package com.wukung.blog;

public interface FlyBehavior {
	void fly();
}

--------------------------------------------------------------------------------------------------------------------------
这是飞行行为的实现类,给真正会飞的鸭子用

package com.wukung.blog;

public class FlyWithWing implements FlyBehavior{

	@Override
	public void fly() {
		// TODO Auto-generated method stub
		System.out.println("我有翅膀我能飞行");
	}

}

--------------------------------------------------------------------------------------------------------------------------
这是飞行行为的实现类,给不会飞的鸭子用

package com.wukung.blog;

public class FlyNoWay implements FlyBehavior {

	@Override
	public void fly() {
		// TODO Auto-generated method stub
		System.out.println("我不能飞行");
	}

}

--------------------------------------------------------------------------------------------------------------------------
这是飞行行为的实现类,给飞的像火箭一样的快的鸭子用

package com.wukung.blog;

public class FlyRocketPower implements FlyBehavior{

	@Override
	public void fly() {
		// TODO Auto-generated method stub
		System.out.println("能使用火箭动力飞行");
	}

}


所有鸭子叫的行为类必须实现的接口:

package com.wukung.blog;

public interface QuackBehavior {
	void quack();
}
--------------------------------------------------------------------------------------------------------------------------
这是叫行为的实现类,给会呱呱叫的鸭子用

package com.wukung.blog;

public class Quack implements QuackBehavior{

	@Override
	public void quack() {
		// TODO Auto-generated method stub
		System.out.println("我能像普通鸭子呱呱叫");
	}
	
}


--------------------------------------------------------------------------------------------------------------------------
这是叫行为的实现类,给不飞会叫的木头鸭子用

package com.wukung.blog;

public class QuackMute implements QuackBehavior{

	@Override
	public void quack() {
		// TODO Auto-generated method stub
		System.out.println("橡皮鸭当让不会叫");
	}

}


--------------------------------------------------------------------------------------------------------------------------
这是叫行为的实现类,给会咯咯叫的诱饵鸭子用

package com.wukung.blog;

public class Squack implements QuackBehavior{

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

	

}


*************************************************************************************************
这是鸭子的功能测试类:

package com.wukung.blog;

/**
 * @author WuKung
 * 测试类鸭子游戏类
 */
public class TestDuck {
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Duck model = new ModleDuck();
		model.performFly();
		model.setFlyBehavior(new FlyRocketPower());
		model.performFly();
	}

}

从上面的鸭子游戏可以看出,使用了策略模式的设计方式:

通过定义飞行类:FlyBehavoir接口和实现该接口的的三个实现类1.FlyNoWay  2.FlyWithWing  3.FlyRocketPower
类似的定义了鸭子叫的声音类:
实现封装飞行行为和叫的行为的算法族,让他们之间可以互相替换(多态的体现,实行动态绑定,运行时绑定),如木头鸭,model原本不会飞,通过model.setFlyBehavior(new FlyRocketPower),传入火箭动力的飞行功能后
立刻就实现了火箭飞。

总结鸭子游戏中用到的设计技巧:
设计原则1.找出应用中可能需要变化之处,把它独立出来,不要和哪些不需要变化的代码混在一起。
设计原则2.针对接口编程而不是针对实现编程。
设计原则3.多用组合,少用继承。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值