鸭子的行为被封装 进入一组类中,能够轻易的扩展和改变。假设须要能够执行时改变行为!

策略模式定义了算法族。分别封装起来。让他们能够相互替换,此模式让算法的变化独立于使用算法的客户。

继承,相似之处用继承,假如如干个功能点须要改动,代码难以维护,

原始代码

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设计模式学习笔记)的更多相关文章

  1. C#设计模式学习笔记:(2)工厂方法模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7567880.html,记录一下学习过程以备后续查用. 一.引言 接上一篇C#设计模式学习笔记:简单工厂模式( ...

  2. 设计模式学习笔记--备忘录(Mamento)模式

    写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方式,这就是软件模式:每个模式描写叙述了一个在我们程序设计中常常发生的问题,以及该问题的解决方式:当我们碰到模 ...

  3. Java设计模式学习笔记(二) 简单工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...

  4. Java设计模式学习笔记(三) 工厂方法模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...

  5. Java设计模式学习笔记(四) 抽象工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 抽象工厂模式概述 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问 ...

  6. C#设计模式学习笔记:(3)抽象工厂模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7596897.html,记录一下学习过程以备后续查用. 一.引言 接上一篇C#设计模式学习笔记:简单工厂模式( ...

  7. HeadFirst设计模式读书笔记--目录

    HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern) HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern) HeadFirst设计 ...

  8. C#设计模式学习笔记-单例模式随笔

    最近学习 设计模式,从单例模式入手 啥是单例模式: 要实现一个单例类的话,首先,肯定是不能让用户自行生产的,那就是说明不能让用户new,所以,就必须把构造函数设置成为私有的 因为静态变量的生命周期跟整 ...

  9. C#设计模式学习笔记-单例模式(转)

    C#设计模式学习笔记-单例模式 http://www.cnblogs.com/xun126/archive/2011/03/09/1970807.html 最近在学设计模式,学到创建型模式的时候,碰到 ...

随机推荐

  1. Moscow Pre-Finals Workshop 2016. Japanese School OI Team Selection. 套题详细解题报告

    写在前面 谨以此篇题解致敬出题人! 真的期盼国内也能多出现一些这样质量的比赛啊.9道题中,没有一道凑数的题目,更没有码农题,任何一题拿出来都是为数不多的好题.可以说是这一年打过的题目质量最棒的五场比赛 ...

  2. FZU 2168 前缀和+dp递推

    Description   部队中共有N个士兵,每个士兵有各自的能力指数Xi,在一次演练中,指挥部确定了M个需要防守的地点,按重要程度从低到高排序,依次以数字1到M标注每个地点的重要程度,指挥部将选择 ...

  3. Gym 100971B 水&愚

    Description standard input/output Announcement   Statements A permutation of n numbers is a sequence ...

  4. HDR 高动态范围图像

    以下来源于百度百科: 高动态范围图像(High-Dynamic Range,简称HDR),相比普通的图像,可以提供更多的动态范围和图像细节,根据不同的曝光时间的LDR(Low-Dynamic Rang ...

  5. C/C++学习路线

    随着互联网及互联网+深入蓬勃的发展,经过40余年的时间洗礼,C/C++俨然已成为一门贵族语言,出色的性能使之成为高级语言中的性能王者.而在今天,它又扮演着什么样重要的角色呢?请往下看: 后端服务器,移 ...

  6. Javascript&Ajax-深入浅出JSONP--解决ajax跨域问题

    Javascript&Ajax-深入浅出JSONP--解决ajax跨域问题 原理讲解: 链接地址:http://www.cnblogs.com/chopper/archive/2012/03/ ...

  7. python编程(python开发的三种运行模式)【转】

    转自:http://blog.csdn.net/feixiaoxing/article/details/53980886 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 单循环 ...

  8. 搞定vim的窗口操作

    最近在给学生演示数据结构代码时,发现用一般的方法总会有不方便,如果使用ide又觉得太浪费了,后来觉得用vim就够了,使用buffer总会需要页面调来跳出,学生看起来容易迷糊.所以就研究了下vim的窗口 ...

  9. Elasticsearch之pythonAPI简单使用

    elasticsearch自动补全建议功能 数据入库操作 ESmapping要求 PUT music { "mappings": { "_doc" : { &q ...

  10. LeetCode OJ-- Longest Palindromic Substring **

    https://oj.leetcode.com/problems/longest-palindromic-substring/ 给一个string,求它的最长回文子串. 定义一个二维数组bool is ...