策略模式(headfirst设计模式学习笔记)
鸭子的行为被封装 进入一组类中,能够轻易的扩展和改变。假设须要能够执行时改变行为!
策略模式定义了算法族。分别封装起来。让他们能够相互替换,此模式让算法的变化独立于使用算法的客户。
继承,相似之处用继承,假如如干个功能点须要改动,代码难以维护,
原始代码
public class Duck {
//鸭子描写叙述
public void dispaly(){
System.out.println("描写叙述");
} //鸭子叫
public void quack(){
System.out.println("会叫");
} }
public class MallarDuck extends Duck{ public static void main(String[] args) {
Duck duck=new Duck();
duck.dispaly();
duck.fly();
duck.quack();
}
}
假如Duck要加入新的行为鸭子飞,那代码难以维护,比方有的鸭子会飞有的不会飞。
假如继承或者实现接口,这二种都依赖于实现,我们会被绑的死死的,没有办法更改很多其它行为。
接口,针对接口编程,而不是针对实现编程,须要改动干个功能点使用接口,实现方式灵活多变。
更改后代码:
package com.base; import com.interfaces.FlyBehavior;
import com.interfaces.QuackBehavior;
/**
* 将大功能点分为接口小模块。接口为了小功能点有弹性,
* @author Hadoop
*
*/
public abstract class Duck {
protected FlyBehavior flyBehavior;
protected QuackBehavior quackBehavior; public void setFlyBehavior(FlyBehavior flyBehavior){
this.flyBehavior=flyBehavior;
}
public void QuackBehavior(QuackBehavior quackBehavior){
this.quackBehavior=quackBehavior;
} public abstract void dispaly();//鸭子描写叙述 /**
* 托付给行为类
*/
public void performFly(){//鸭子飞
flyBehavior.fly();
}
public void performQuack(){//鸭子叫
quackBehavior.quack();
} }
package com.interfaces; /**
* 行为类(飞)
* @author Hadoop
*
*/
public interface FlyBehavior {
void fly();
}
package com.interfaces; /**
* 鸭子叫
* @author Hadoop
*
*/ public interface QuackBehavior {
void quack();
}
package com.interfaces.impl; import com.interfaces.FlyBehavior; public class FlyNoWay implements FlyBehavior { public void fly() {
System.out.println("鸭子不会飞行");
} }
package com.interfaces.impl; import com.interfaces.FlyBehavior; public class FlyRocketPowered implements FlyBehavior { public void fly() {
// TODO Auto-generated method stub
System.out.println("助力器");
} }
package com.interfaces.impl; import com.interfaces.FlyBehavior; public class FlyWithWings implements FlyBehavior { public void fly() {
System.out.println("鸭子飞行");
} }
package com.interfaces.impl; import com.interfaces.QuackBehavior; public class Quack implements QuackBehavior { public void quack() {
// TODO Auto-generated method stub
System.out.println("橡皮鸭子叫");
} }
package com.interfaces.impl; import com.interfaces.QuackBehavior; public class Squack implements QuackBehavior { public void quack() {
// TODO Auto-generated method stub
System.out.println("鸭子叫");
} }
详细鸭子
package com; import com.base.Duck;
import com.interfaces.impl.FlyNoWay;
import com.interfaces.impl.FlyWithWings;
import com.interfaces.impl.Quack; public class MallarDuck extends Duck{
public MallarDuck(){
quackBehavior=new Quack();
flyBehavior=new FlyNoWay();
} public void dispaly() {
System.out.println("描写叙述");
}
}
import java.io.IOException; import com.MallarDuck;
import com.interfaces.impl.FlyRocketPowered; public class test { /**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
MallarDuck mallarDuck=new MallarDuck();
mallarDuck.dispaly();
mallarDuck.setFlyBehavior(new FlyRocketPowered());
mallarDuck.performFly();
mallarDuck.performQuack(); } }
设计原则:多用组合,少用继承组合建立系统有非常大弹性,不仅能够将算法分类,并且能够动态的改变行为。 仅仅要组合行为对象符合正确的接口标本就可以。
策略模式(headfirst设计模式学习笔记)的更多相关文章
- C#设计模式学习笔记:(2)工厂方法模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7567880.html,记录一下学习过程以备后续查用. 一.引言 接上一篇C#设计模式学习笔记:简单工厂模式( ...
- 设计模式学习笔记--备忘录(Mamento)模式
写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方式,这就是软件模式:每个模式描写叙述了一个在我们程序设计中常常发生的问题,以及该问题的解决方式:当我们碰到模 ...
- Java设计模式学习笔记(二) 简单工厂模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...
- Java设计模式学习笔记(三) 工厂方法模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...
- Java设计模式学习笔记(四) 抽象工厂模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 抽象工厂模式概述 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问 ...
- C#设计模式学习笔记:(3)抽象工厂模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7596897.html,记录一下学习过程以备后续查用. 一.引言 接上一篇C#设计模式学习笔记:简单工厂模式( ...
- HeadFirst设计模式读书笔记--目录
HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern) HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern) HeadFirst设计 ...
- C#设计模式学习笔记-单例模式随笔
最近学习 设计模式,从单例模式入手 啥是单例模式: 要实现一个单例类的话,首先,肯定是不能让用户自行生产的,那就是说明不能让用户new,所以,就必须把构造函数设置成为私有的 因为静态变量的生命周期跟整 ...
- C#设计模式学习笔记-单例模式(转)
C#设计模式学习笔记-单例模式 http://www.cnblogs.com/xun126/archive/2011/03/09/1970807.html 最近在学设计模式,学到创建型模式的时候,碰到 ...
随机推荐
- POJ 3621 Sightseeing Cows(最优比例环+SPFA检测)
Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10306 Accepted: 3519 ...
- BZOJ3524 [Poi2014]Couriers 【主席树】
题目 给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. 输入格式 第一 ...
- JAVA File方法文本复制读写-解决中文乱码
import java.io.*; public class TextFile { public static void main(String[] args) throws Exception { ...
- jspspy database help
.
- canvas游戏开发系列(1):基础知识
canvas基础知识 canvas是什么? canvas是html5的一个元素,可以说他的功能是html元素中最强大的一个. 举个栗子: 第一步:在页面中引入canvas标签,并且设置好宽高背景等样式 ...
- LOJ#2084. 「NOI2016」网格
$n,m \leq 1e9$,$n*m$的网格中有$c \leq 1e5$个是黑的,其他是白的.问:使至少两个白的不连通,最少需要再把几个白的涂黑. 可以发现答案是-1,0,1,2啦.-1要么没白的, ...
- SQL优化 ASP.NET ADO.NET
原文发布时间为:2009-08-26 -- 来源于本人的百度文章 [由搬家工具导入] 总的考虑方向 1) 根据数据使用的方式来设计数据访问层 2) 缓存数据,避免不必要的操 ...
- 【Visual Studio - Dependency Walker】查找程序依赖的动态链接库文件(转)
原文转自 http://163n.blog.163.com/blog/static/5603555220113151113287/ 有时我们需要知道一个程序依赖哪些动态链接库(DLL)文件.实际上,有 ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---17
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:
- Facebook为什么使用PHP编程语言?
当日本计算机科学家松本行弘决定创造一种名叫 Ruby (这种技术支撑了 Twitter.Hulu以及其他许多现代 Web 流行网站) 的程序语言时,他是从 1966 年一部名为 Babel-17 的科 ...