欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计模式之策略模式

程序员文章站 2024-02-09 16:41:34
...

策略模式:分别封装行为(算法)接口,超类里放行为(算法)接口,在子类里赋值具体行为(算法)对象。
原则:分离变化部分,封装接口,基于接口编程各种行为(算法)功能。
作用:此方法让行为(算法)的变化独立于行为(算法)的使用者。

一 模拟鸭子的游戏

1、鸭子的抽象类

实现

public abstract class Duck {

	public Duck() {
	}

	public void Quack() {
		System.out.println("~~gaga~~");
	}

	public abstract void display();

	public void swim() {
		System.out.println("~~im swim~~");
	}
	
	public void Fly() {
			System.out.println("~~im fly~~");
		}
	
}

2、鸭子的具体实现类

1)、GreenHeadDuck

public class GreenHeadDuck extends Duck {

	@Override
	public void display() {
		System.out.println("**GreenHead**");
	}

	public void Fly() {
		System.out.println("~~no fly~~");
	}
}

2)、RedHeadDuck

public class RedHeadDuck extends Duck {

	@Override
	public void display() {
		System.out.println("**RedHead**");
	}

//	public void Fly() {
//		System.out.println("~~good fly~~");
//	}
}

3)、StoneDuck

public class StoneDuck extends Duck {

	@Override
	public void display() {
		System.out.println("**StoneDuck**");
	}

	public void Quack() {
		System.out.println("~~no gaga~~");
	}
	public void swim() {
		System.out.println("~~no swim~~");
	}
	
	public void Fly() {
		System.out.println("~~no fly~~");
	}
}

3、以上遇到的问题、

当我们要扩展一个行为的时候,例如fly,
1、使用继承的时候,fly()的实现放在超类,优点是代码的复用,缺点是有功能溢出;
2、不使用继承的时候,fly()在各个子类中实现,缺点是代码复用性不好;
为解决以上两点,就用行为的组合,不用行为的继承;既满足代码复用,也满足不功能溢出。

二、分析问题的方法论

1)、分析问题的变化部分和不变部分,提取变化部分,抽象成接口+实现;
2)、鸭子哪些功能是会根据新需求变化的?叫声/飞行。。。

例如:
1、接口:
1)、飞行的接口:

public interface FlyBehavior{
void fly();
}

2)、叫声的接口

public interface QuackBehavior {
void quack();
}

3)好处:新增行为简单,行为类更好的复用,组合更方便。既有继承带来的复用好处,没有挖坑

三、策略模式的实现

1、增加行为接口的抽象Duck

public abstract class Duck {

	FlyBehavior mFlyBehavior;
	QuackBehavior mQuackBehavior;

	public Duck() {}

	public void Fly() {
		mFlyBehavior.fly();
	}

	public void Quack() {
		mQuackBehavior.quack();
	}

	public abstract void display();

	public void swim() {
		System.out.println("~~im swim~~");
	}

2、行为接口及具体实现

1)、行为接口

public interface FlyBehavior {
	void fly();`在这里插入代码片`
}

2)、BadFlyBehavior具体行为

public class BadFlyBehavior implements FlyBehavior
{
	@Override
	public void fly() {
		// TODO Auto-generated method stub
		System.out.println("--BadFly--");
	}
}

3)、GoodFlyBehavior具体行为

public class GoodFlyBehavior implements FlyBehavior
{
	@Override
	public void fly() {
		System.out.println("--GoodFly--");
	}
}

4)、NoFlyBehavior具体行为

public class NoFlyBehavior implements FlyBehavior
{
	@Override
	public void fly() {
		// TODO Auto-generated method stub
		System.out.println("--NoFly--");
	}
}

3、具体实现的GreenHeadDuck

public class GreenHeadDuck extends Duck {

	public GreenHeadDuck() {
		mFlyBehavior = new GoodFlyBehavior();
		mQuackBehavior = new GaGaQuackBehavior();
	}
	@Override
	public void display() {
		System.out.println("**GreenHead**");
	}
}