首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >设计模式之策略模式

设计模式之策略模式

作者头像
用户9854323
发布2022-06-25 10:33:50
发布2022-06-25 10:33:50
3900
举报
文章被收录于专栏:小陈飞砖小陈飞砖

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

文章目录

一 模拟鸭子的游戏

1、鸭子的抽象类

实现

代码语言:javascript
复制
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
代码语言:javascript
复制
public class GreenHeadDuck extends Duck {

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

	public void Fly() {
		System.out.println("~~no fly~~");
	}
}
2)、RedHeadDuck
代码语言:javascript
复制
public class RedHeadDuck extends Duck {

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

//	public void Fly() {
//		System.out.println("~~good fly~~");
//	}
}
3)、StoneDuck
代码语言:javascript
复制
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)、飞行的接口:

代码语言:javascript
复制
public interface FlyBehavior{
void fly();
}

2)、叫声的接口

代码语言:javascript
复制
public interface QuackBehavior {
void quack();
}

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

三、策略模式的实现

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

代码语言:javascript
复制
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)、行为接口
代码语言:javascript
复制
public interface FlyBehavior {
	void fly();`在这里插入代码片`
}
2)、BadFlyBehavior具体行为
代码语言:javascript
复制
public class BadFlyBehavior implements FlyBehavior
{
	@Override
	public void fly() {
		// TODO Auto-generated method stub
		System.out.println("--BadFly--");
	}
}
3)、GoodFlyBehavior具体行为
代码语言:javascript
复制
public class GoodFlyBehavior implements FlyBehavior
{
	@Override
	public void fly() {
		System.out.println("--GoodFly--");
	}
}
4)、NoFlyBehavior具体行为
代码语言:javascript
复制
public class NoFlyBehavior implements FlyBehavior
{
	@Override
	public void fly() {
		// TODO Auto-generated method stub
		System.out.println("--NoFly--");
	}
}

3、具体实现的GreenHeadDuck

代码语言:javascript
复制
public class GreenHeadDuck extends Duck {

	public GreenHeadDuck() {
		mFlyBehavior = new GoodFlyBehavior();
		mQuackBehavior = new GaGaQuackBehavior();
	}
	@Override
	public void display() {
		System.out.println("**GreenHead**");
	}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-10-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一 模拟鸭子的游戏
    • 1、鸭子的抽象类
    • 2、鸭子的具体实现类
    • 3、以上遇到的问题、
  • 二、分析问题的方法论
  • 三、策略模式的实现
    • 1、增加行为接口的抽象Duck
    • 2、行为接口及具体实现
  • 3、具体实现的GreenHeadDuck
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档