博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之策略模式
阅读量:4069 次
发布时间:2019-05-25

本文共 2614 字,大约阅读时间需要 8 分钟。

策略模式:分别封装行为(算法)接口,超类里放行为(算法)接口,在子类里赋值具体行为(算法)对象。

原则:分离变化部分,封装接口,基于接口编程各种行为(算法)功能。
作用:此方法让行为(算法)的变化独立于行为(算法)的使用者。

文章目录

一 模拟鸭子的游戏

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**");	}}

转载地址:http://dhaji.baihongyu.com/

你可能感兴趣的文章
ubuntu 12.04 安装 GMA3650驱动
查看>>
新版本的linux如何生成xorg.conf
查看>>
xorg.conf的编写
查看>>
启用SELinux时遇到的问题
查看>>
virbr0 虚拟网卡卸载方法
查看>>
No devices detected. Fatal server error: no screens found
查看>>
新版本的linux如何生成xorg.conf
查看>>
virbr0 虚拟网卡卸载方法
查看>>
Centos 6.0_x86-64 终于成功安装官方显卡驱动
查看>>
Linux基础教程:CentOS卸载KDE桌面
查看>>
project web_performance
查看>>
OS + Linux Fedora 15 / 16 / 17 / 18 / 19
查看>>
js calendar / wannianli
查看>>
hd cdnServer 51cdn / ChinaCache / ATS / Apache Traffic Server
查看>>
project web architecture
查看>>
OS + Unix HP-UX
查看>>
OS + Unix Solaris / openSolaris
查看>>
db sql montior
查看>>
Unix + SCO UnixWare
查看>>
db db2 books
查看>>