Java的设计模式----strategy(策略模式)
public abstract class Duck{
public void quack(){ //呱呱叫
System.out.println("呱呱叫");
}
public void swim(){ //游泳
System.out.println(" 游泳");
}
public abstract void display(); /*因为外观不一样,让子类自己去决定了。*/
}
对于它的子类只需简单的继承就可以了,并实现自己的display()方法。
//野鸭
public class MallardDuck extends Duck{
public void display(){
System.out.println("野鸭的颜色...");
}
}
//红头鸭
public class RedheadDuck extends Duck{
public void display(){
System.out.println("红头鸭的颜色...");
}
}
public abstract class Duck{
public void quack(){ //呱呱叫
System.out.println("呱呱叫");
}
public void swim(){ //游泳
System.out.println(" 游泳");
}
public abstract void display(); /*因为外观不一样,让子类自己去决定了。*/
public void fly(){
System.out.println("飞吧!鸭子");
}
}
对于不能飞的鸭子,在子类中只需简单的覆盖。
//残废鸭
public class DisabledDuck extends Duck{
public void display(){
System.out.println("残废鸭的颜色...");
}
public void fly(){
//覆盖,变成什么事都不做。
}
}
其它会飞的鸭子不用覆盖。
public interface Flyable{
public void fly();
}
public interface Quackable{
public void quack();
}
最后Duck的设计成为:
public abstract class Duck{
public void swim(){ //游泳
System.out.println(" 游泳");
}
public abstract void display(); /*因为外观不一样,让子类自 己去决定了。*/
}
而MallardDuck,RedheadDuck,DisabledDuck 就可以写成为:
//野鸭
public class MallardDuck extends Duck implements Flyable,Quackable{
public void display(){
System.out.println("野鸭的颜色...");
}
public void fly(){
//实现该方法
}
public void quack(){
//实现该方法
}
}
//红头鸭
public class RedheadDuck extends Duck implements Flyable,Quackable{
public void display(){
System.out.println("红头鸭的颜色...");
}
public void fly(){
//实现该方法
}
public void quack(){
//实现该方法
}
}
//残废鸭 只实现Quackable(能叫不能飞)
public class DisabledDuck extends Duck implements Quackable{
public void display(){
System.out.println("残废鸭的颜色...");
}
public void quack(){
//实现该方法
}
}
public interface FlyBehavior{
public void fly();
}
public interface QuackBehavior{
public void quack();
}
我们在定义一些针对FlyBehavior的具体实现。
public class FlyWithWings implements FlyBehavior{
public void fly(){
//实现了所有有翅膀的鸭子飞行行为。
}
}
public class FlyNoWay implements FlyBehavior{
public void fly(){
//什么都不做,不会飞
}
}
针对QuackBehavior的几种具体实现。
public class Quack implements QuackBehavior{
public void quack(){
//实现呱呱叫的鸭子
}
}
public class Squeak implements QuackBehavior{
public void quack(){
//实现吱吱叫的鸭子
}
}
public class MuteQuack implements QuackBehavior{
public void quack(){
//什么都不做,不会叫
}
}
点评一: 这样的设计,可以让飞行和呱呱叫的动作被其他的对象复用,因为这些行为已经与鸭子类无关了。而我们增加一些新
public abstract class Duck{ --------->在抽象类中,声明各接口,定义各接口对应的方法.
FlyBehavior flyBehavior;//接口
QuackBehavior quackBehavior;//接口
public Duck(){}
public abstract void display();
public void swim(){
//实现游泳的行为
}
public void performFly(){
flyBehavior.fly(); //-->由于是接口,会根据继承类实现的方式,而调用相应的方法.
}
public void performQuack(){
quackBehavior.quack();
}
}
看看MallardDuck如何实现。
----->通过构造方法,生成'飞','叫'具体实现类的实例,从而指定'飞','叫'的具体属性
public class MallardDuck extends Duck{
public MallardDuck {
flyBehavior = new FlyWithWings ();
quackBehavior = new Quack();
//因为MallardDuck 继承了Duck,所有具有flyBehavior 与quackBehavior 实例变量}
public void display(){
//实现
}
}
这样就满足了即可以飞,又可以叫,同时展现自己的颜色了。
public abstract class Duck{
FlyBehavior flyBehavior;//接口
QuackBehavior quackBehavior;//接口
public void setFlyBehavior(FlyBehavior flyBehavior){
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior {
this.quackBehavior= quackBehavior;
}
}
本文出自 “Changes we need !” 博客,请务必保留此出处http://shenzhenchufa.blog.51cto.com/730213/161581
Java的设计模式----strategy(策略模式)的更多相关文章
- 一天一个设计模式——Strategy策略模式
一.模式说明 策略模式比较好理解,就是将程序中用到的算法整体的拿出来,并有多个不同版本的算法实现,在程序运行阶段,动态的决定使用哪个算法来解决问题. 举个实际的例子:排序算法的问题,假如我们的程序中需 ...
- C++设计模式-Strategy策略模式
Strategy策略模式作用:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. UML图: Strategy模式将逻辑(算法)封装到一个类(Cont ...
- Java设计模式---Strategy策略模式
参考于 : 大话设计模式 马士兵设计模式视频 1.场景介绍 购物网站上有一个产品,有三个字段,档次,价格,重量. 有些同学喜欢轻的,有些手头紧,想要便宜的,有些喜欢档次高的. 那么我们为了提高网站用户 ...
- [java之设计模式]策略模式
策略模式(strategy pattern) 定义>> 将一系列的算法封装到一些列的类里面,并且可以相互替换 作用>> 将算法的变化独立于客户端,将算法的指责和算法的行为分开, ...
- [C++设计模式] strategy 策略模式
依照陈硕老师的观点.c++里有面向过程编程.面向对象编程,基于对象编程(面向接口编程)和泛型编程.四种思路都各有其适用场景. 面向过程编程是沿袭C的结构化编程思路,OOP是C++的核心,也是现代高级编 ...
- 设计模式:策略模式,Java集合定制排序的核心思想
前言 前阵子面试的时候,有个面试官问我了解哪些设计模式吗?我说了策略模式.接着他问有哪些场景应用,我又回答他jdk的集合工具类有个排序方法就用到了策略模式,也就是java.util包下的Collect ...
- 设计模式:Strategy 策略模式 -- 行为型
设计模式 策略模式Strategy(对象行为型) 这是几年前写的文字(转载做的笔记更准确些),发觉还是废话多了点. 其实,核心就是5.结构中的UML图 5.1 和 5.2(新增).现在看这张图就觉得一 ...
- 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)
原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...
- 设计模式22:Strategy 策略模式(行为型模式)
Strategy 策略模式(行为型模式) 动机(Motivation) 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂:而且有时候支持 ...
随机推荐
- 如何隐藏Cognos Viewer
做BI项目很多时候需要跟Portal做集成,可以将整个BI Portal放到企业门户或者只是存放一些固定的报表.由于Cognos默认运行会带出Cognos Viewer,这样就跟门户不太协调. 有几种 ...
- hadoop-1.1.0 rpm + centos 6.3 64虚拟机 + JDK7 搭建分布式集群
第一步 ,环境准备. 宿主机为CentOS6.3 64位,3个虚拟机为CentOS6.3 64位. (注意:有个技巧,可以先创建一台虚拟机,在其上安装好JDK.hadoop后再克隆两台,这样省时又省 ...
- .NET基础——循环、枚举
1. 循环结构 3种循环语句:while.do-while.for 面对循环我们应当注意: 1. 循环在做什么?(重复做的事情——也就是循环体的内容) 2. 循环的终止条件是什么?(循环条件) 3种循 ...
- Python 函数简介 之二
1.当函数有多个返回值时, 其多个返回值将以元组的形式出现 def test1(): print("in the test1") return 'end' def test2(): ...
- shell编程其实真的很简单(二)
上篇我们学会了如何使用及定义变量.按照尿性,一般接下来就该学基本数据类型的运算了. 没错,本篇就仍是这么俗套的来讲讲这无聊但又必学的基本数据类型的运算了. 基本数据类型运算 操作符 符号 语义 描述 ...
- flexbox备忘
伸缩项目的父元素: display:flex || display:inline-flex fiex-direction: row(默认) | row-reverse | column | colum ...
- 2017年IT互联网圈跑会指南~
啦啦啦~要放假啦,还有十多天就要过年啦,要走亲访友啦!相信大家也是各种胡吃海喝后,啊咧~腰上好像多了好几圈o(>﹏<)o为了让小伙伴们及时制定年后行程(减膘)计划,活动家特此奉上2017年 ...
- mongodb tip-2
1.or 查询的格式: var condition = {$or:[{field:1},{field:2}]} 2.字符串存储日期也可以用$gt $gte $lt $lte 直接比较 var cond ...
- 【转】Hive执行计划
执行语句 hive> explain select s.id, s.name from student s left outer join student_tmp st on s.name = ...
- 最近用到mysql和mybatis结合常用的知识点坐下整理
1.当用到集合in(x,x...)参数可以单个或者多个 ,当为单个时: findbyIds(List<Long> ids),或者findByids(Long [] ids) <se ...