【Head First设计模式-读书笔记】策略模式

原创 2015年11月18日 21:24:04


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

 

对于一个已经抽象出来的抽象类如果想要再向它的子类增加功能,这个功能有不同的实现,那么直接在抽象类里加一个功能,然后子类重写,或者给子类加上一个该功能的借口。都可以实现,但是如果很大一部分子类都具有相同的功能那么代码的复用率就会很低。

所以只在抽象类里定义一个功能借口的对象(相当于挂了一个钩子),然后用另外的类来实现功能接口,这样子类只需要挑选不同功能而不需要考虑功能的实现。

栗子:

有一个鸭子的抽象类(右say,fly功能),我们把它们分离出来单独实现;

package com.ztc.duck;

import com.ztc.fly.Iflyable;
import com.ztc.say.Isayable;

/**
 * Created by ztc on 15-11-18.
 */
public abstract class duck {
  //功能借口
    Iflyable f;
    Isayable s;
    public duck(){

    }

    public Isayable getS() {
        return s;
    }

    public void setS(Isayable s) {
        this.s = s;
    }

    public Iflyable getF() {
        return f;
    }

    public void setF(Iflyable f) {
        this.f = f;
    }

    public void fly(){

        f.fly();
    }
    public void say(){
        s.say();
    }
}

2.写接口的不同实现

package com.ztc.say;

/**
 * Created by ztc on 15-11-18.
 */
public interface Isayable {
    public void say();
}

package com.ztc.say;

/**
 * Created by ztc on 15-11-18.
 */
public class sayType1 implements Isayable {
    @Override
    public void say() {
        System.out.println("I'm Say 1");
    }
}

package com.ztc.say;

/**
 * Created by ztc on 15-11-18.
 */
public class sayType2 implements Isayable {
    @Override
    public void say() {
        System.out.println("I'm Say 2");
    }
}

package com.ztc.say;

/**
 * Created by ztc on 15-11-18.
 */
public class sayType3 implements Isayable{
    @Override
    public void say() {
        System.out.println("I'm Say 3");
    }
}

3.写不同的子类就可以选择不同的功能而不用管功能的实现,提高了代码的复用率

package com.ztc.duck;

import com.ztc.fly.flyType1;
import com.ztc.say.sayType3;

/**
 * Created by ztc on 15-11-18.
 */
public class duckType1 extends duck {
    public duckType1(){
        f=new flyType1();
        s=new sayType3();
    }
}

package com.ztc.duck;

import com.ztc.fly.flyType2;
import com.ztc.say.sayType1;

/**
 * Created by ztc on 15-11-18.
 */
public class duckType2 extends duck {
    public duckType2(){
        f=new flyType2();
        s=new sayType1();
    }
}


版权声明:本文为博主原创文章,转载请注明出处。

Head First 设计模式学习笔记 ——策略模式

Head First 设计模式学习 ——策略模式简单理解     问题来源:     在子类继承父类时,如果子类不需要使用父类中的某些方法,该如何处理?     举个例子,如下图所示,父类Duck类抽...
  • u010429424
  • u010429424
  • 2016年07月27日 19:22
  • 462

调侃《Head First设计模式》之总结篇

在之前的设计模式博客中,主要根据《Head First设计模式》谈了10个设计模式,今天来做下总结,好好梳理提炼x下精华,而且今天准备把GOF经典大作《设计模式》中的23个设计模式都总结一遍。(以下内...
  • sinat_23092639
  • sinat_23092639
  • 2015年06月27日 09:38
  • 2171

《Head First设计模式》-策略模式C++实现

用C++实现了书中的设计鸭子飞行的例子。 鸭子类设计 #ifndef DUCK_H_ #define DUCK_H_ #include #include"Fly.h" #include"Quack...
  • a1358884804
  • a1358884804
  • 2017年01月11日 18:33
  • 260

调侃《First head 设计模式》之状态模式篇

现在有个糖果控制器,它的运行状态图如下:          我们要用java来实现这个糖果控制器。首先需要用一些实例变量来表示不同的状态:          我们的思路是创建一个糖果控制器类,...
  • sinat_23092639
  • sinat_23092639
  • 2015年05月24日 10:42
  • 1063

图解 head first 设计模式

个人笔记,比较粗糙。详细内容请参考《head first 设计模式》 strategy 基础:抽象、封装、多态、继承 原则 封装变化:找出会变化的方面,把它们从不变的部分分离出来。 多用组合、少用继承...
  • qq_24145735
  • qq_24145735
  • 2016年07月16日 23:13
  • 3061

读《大话设计模式》和《head first 设计模式》心得

1.面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。 2.如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责...
  • fuqiaoyimeng
  • fuqiaoyimeng
  • 2013年11月10日 18:17
  • 1163

Head First设计模式C++实现--第一章:策略模式

策略模式
  • FightForProgrammer
  • FightForProgrammer
  • 2014年06月21日 22:51
  • 1668

【设计模式】HeadFirst设计模式(四):工厂模式

设计模式要求我们不应该针对实现编程,为了降低耦合度,提高可维护性。当程序中出现“new”的时候,就证明程序在实例化一个具体类,所以用的是实现,而不是接口。如果代码绑着具体的类会导致代码更加脆弱,缺乏弹...
  • u010800530
  • u010800530
  • 2015年05月31日 22:47
  • 980

策略模式(Strategy Pattern)(二):HeadFirst中鸭子的实现

一、问题描述 joe上班的公司做了一套成功的模拟鸭子的游戏:SimUDuck,游戏中会出现各种鸭子,一边游泳,一边呱呱叫,由于公司竞争压力加剧,必须重新设计鸭子(Duck)类,要求是:便于产...
  • jialinqiang
  • jialinqiang
  • 2013年05月11日 09:40
  • 2746

《Head First 设计模式》整理

对《Head First 设计模式》中的常用设计模式的整理,其实很多模式我们在开发中都有用到,但是在此之前没有一种理论基础支撑自己,有了这些知识后,更有利于做好程序的设计工作,以及遇到一些设计问题时知...
  • zhangao0086
  • zhangao0086
  • 2015年04月11日 00:56
  • 3160
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Head First设计模式-读书笔记】策略模式
举报原因:
原因补充:

(最多只允许输入30个字)