策略模式(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 最近在学设计模式,学到创建型模式的时候,碰到 ...
随机推荐
- 文本文件txt生成excel
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- HDU 5418 Victor and World(状压DP+Floyed预处理)
Victor and World Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/131072 K (Java/Other ...
- cf 853 A planning [贪心]
题面: 传送门 思路: 一眼看得,这是贪心[雾] 实际上,我们要求的答案就是sigma(ci*(ti-i))(i=1~n),这其中sigma(ci*i)是确定的 那么我们就要最小化sigma(ci*t ...
- POJ 1941 The Sierpinski Fractal ——模拟
只需要开一个数组,记录一下这个图形. 通过一番计算,发现最大的面积大约是2k*2k的 然后递归下去染三角形. 需要计算出左上角的坐标. 然后输出的时候需要记录一下每一行最远延伸的地方,防止行末空格过多 ...
- ionic2 使用slides制作滑动效果的类型选择栏
类似的效果如下图: 1. 生成一个component ionic g component MySlide 2. 在my-slide.html中添加代码: <ion-slides class=&q ...
- Codeforces Round #362 (Div. 2) A 水也挂
A. Pineapple Incident time limit per test 1 second memory limit per test 256 megabytes input standar ...
- 七牛云的cdn配置
https://segmentfault.com/q/1010000004265556
- JavaScript 笔记(3) -- JSON
JavaScript JSON (JavaScript Object Notation): 是一种轻量级的数据交换格式 JSON 是用于存储和传输数据的格式 JSON 通常用于服务端向网页传递数据 J ...
- 【14】redux 之 redux-actions
redux-actions有两大法宝createAction和handleActions. createAction http://www.jianshu.com/p/6ba5cd795077 原来创 ...
- 自定义JQuery扩展方法
; (function ($, window, document, undefined) { $.getUrlParam = function (name) { var reg = new RegEx ...