文档章节

四、设计模式——策略模式

文森特梵高
 文森特梵高
发布于 2015/08/14 02:05
字数 966
阅读 109
收藏 12

面向对象的设计方案

产品狗今天跟你说,要做一个“模拟鸭子游戏”,需求如下:

鸭子有共同的功能,比如游泳和叫。

鸭子也有不同的功能,比如有绿头鸭和红头鸭。

所以想到了通过使用OO的方式,将共同的功能放在抽象类Duck中,而不同的用abstract修饰供子类实现。

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 class GreenHeadDuck extends Duck {//绿头鸭
	@Override
	public void display() {
		System.out.println("**GreenHead**");
	}
}
public class RedHeadDuck extends Duck {//红头鸭
	@Override
	public void display() {
		System.out.println("**RedHead**");
	}
}

通过面向对象的思想,我们实现了复用,完成了需求。


新需求


看看这种设计在增加新功能的时候,其扩展性如何。

新需求:添加会飞的鸭子

public abstract class Duck {
        //...略...
	public void Fly() {
	     System.out.println("~~im fly~~");
	}
}

如果在超类中添加这段代码,那么问题马上就来了,超类中添加的方法对所有之类都生效,而不是所有的鸭子都需要这个功能。

public class GreenHeadDuck extends Duck {
        //...略...
	public void Fly() {
		System.out.println("~~no fly~~");
	}
}

那我们可以覆盖掉不会飞的鸭子的fly方法,不就可以了吗~~~

问题又来了,如果有10种不会飞的鸭子,岂不是要重复做10次重复性的工作?

那可不可以把超类中的fly方法弄成abstract呢?

这样所有的之类不就都要实现fly方法吗~如果50种鸭子,那就需要实现50次!

如果又有新需求,比如石头鸭子,既不会飞也不会叫 ,如何实现? +_+

看来上述都不是很好的设计方案。



思路


分析软件设计需要考虑两方面的问题

1)分析项目变化和不变的部分,对于变化的部分,抽象成接口+实现;

2)找到那些功能会根据新需求而变化。

这个模拟鸭子的游戏中,鸭子的叫声和飞行方式会变。



策略模式实现

对飞行和叫分别设计接口,对于不同的叫声和飞行再通过实现的方式完成。

public interface FlyBehavior {
	void fly();
}
public	interface QuackBehavior {
	void quack();
}

这样新增行为变得很简单,只需要实现相同的接口即可。

在鸭子超类中,通过组合抽象的飞行和抽象的叫声,具体的叫和飞交给之类补充。

import com.java.hexter.stimulateduck.flybehavior.FlyBehavior;
import com.java.hexter.stimulateduck.quackbehavior.QuackBehavior;

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 SetQuackBehavoir(QuackBehavior qb) {
		mQuackBehavior = qb;
	}
	public void SetFlyBehavoir(FlyBehavior fb) {
		mFlyBehavior = fb;
	}
	public void swim() {
		System.out.println("~~im swim~~");
	}
}

看到没有,抽象超类中没有任何具体的实现类耦合,而是通过接口调用。

里面的fly还是quack函数,都是根据之类mFlyBehavior和mQuackBehavior的不同而不同。

看看绿头鸭以及红头鸭的实现过程。

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

public class RedHeadDuck extends Duck {
	public RedHeadDuck() {
		mFlyBehavior = new BadFlyBehavior();
		mQuackBehavior = new GeGeQuackBehavior();
	}
	@Override
	public void display() {
		System.out.println("**RedHead**");
	}
}

很强大,又木有~~~ 脑洞打开的赶脚


策略模式:

行为抽象成接口,并且实现算法族,在超类中放行为接口对象,子类里具体设置行为对象。

原则是分离变化部分,封装接口,基于接口编程各种功能,让行为的实现能单独变化。


© 著作权归作者所有

共有 人打赏支持
文森特梵高
粉丝 2
博文 28
码字总数 15386
作品 0
广州
程序员
私信 提问
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.1K
69
Java 设计模式(14) —— 复合模式

一、复合模式 模式常一起使用,组合在一个设计解决方案中 复合模式在一个解决方案中结合两个或多个模式,能解决一般性或一系列的问题 二、示例 本次设计模式讲解中无代码示例,由于复合模式是...

磊_lei
05/26
0
0
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
06/24
0
0
编程中的那些套路——关于策略模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 今天讲讲策略模式,策略模式 和工厂模式十分相像(或者说在代码逻辑层面,他们是一样的)。 但策略模式与...

gzchen
08/27
0
0
编程中的那些套路——关于适配器模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 今天我们来谈谈适配器模式。 想象一个场景: 有一个类方法它部署在服务器上,专门负责大多数语言都通用的...

gzchen
08/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

jquery通过id显示隐藏

var $div3 = $('#div3'); 显示 $div3.show(); 隐藏 $div3.hide();

yan_liu
今天
3
0
《乱世佳人》读书笔记及相关感悟3900字

《乱世佳人》读书笔记及相关感悟3900字: 之前一直听「荔枝」,后来不知怎的转向了「喜马拉雅」,一听就是三年。上班的时候听房产,买房了以后听装修,兴之所至时听旅行,分手后听亲密关系,...

原创小博客
今天
3
0
大数据教程(9.6)map端join实现

上一篇文章讲了mapreduce配合实现join,本节博主将讲述在map端的join实现; 一、需求 实现两个“表”的join操作,其中一个表数据量小,一个表很大,这种场景在实际中非常常见,比如“订单日志...

em_aaron
今天
3
0
cookie与session详解

session与cookie是什么? session与cookie属于一种会话控制技术.常用在身份识别,登录验证,数据传输等.举个例子,就像我们去超市买东西结账的时候,我们要拿出我们的会员卡才会获取优惠.这时...

士兵7
今天
3
0
十万个为什么之为什么大家都说dubbo

Dubbo是什么? 使用背景 dubbo为什么这么流行, 为什么大家都这么喜欢用dubbo; 通过了解分布式开发了解到, 为适应访问量暴增,业务拆分后, 子应用部署在多台服务器上,而多台服务器通过可以通过d...

尾生
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部