第一章---策略模式

xzmxddx

  学习方式:书籍《Head First 设计模式》,这本书通俗易懂,所有知识点全部取自本书。

面向对象设计原则

  • 封装变化
  • 多用组合,少用继承
  • 针对接口编程,不针对实现编程
  • 为交互对象之间的松耦合设计而努力
  • 类应该对扩展开放,对修改关闭
  • 依赖抽象,不要依赖具体类
  • 只和朋友交谈
  • 别找我,我会找你
  • 类应该只有一个改变的理由

一、定义

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

  我的理解:举个例子,玩小游戏的时候,我们需要切换武器,每个武器对象所对应的行为不同,但是我们将这些武器(算法族)封装起来,让它们独立替换,不同的武器,有着不同的效果,这里就可以使用策略模式,武器们实现一个共同的接口即可

二、UML类图

  这里我使用了鸭子会飞,会叫,这两个行为的例子,鸭子叫声不一样(算法族),飞行行为也不一样(算法族)

  eclipse截图:

  

 

三、代码示例

  鸭子抽象类以及子类:

  Duck

package hue.edu.xiong.first.duck;

import hue.edu.xiong.first.fly.FlyBehavior;
import hue.edu.xiong.first.quack.QuackBehavior; public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior; public abstract void display(); public void performFly() {
flyBehavior.fly();
} public void performQuack() {
quackBehavior.quack();
} public void swim() {
System.out.println("All ducks float,even decoys!!");
} public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
} public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}

  MallardDuck

package hue.edu.xiong.first.duck;

import hue.edu.xiong.first.fly.FlyWithWings;
import hue.edu.xiong.first.quack.Quack; public class MallardDuck extends Duck {
public MallardDuck() {
flyBehavior = new FlyWithWings();
quackBehavior = new Quack();
} @Override
public void display() {
System.out.println("It is MallardDuck!!!");
} }

  ModelDuck

package hue.edu.xiong.first.duck;

import hue.edu.xiong.first.fly.FlyNoWay;
import hue.edu.xiong.first.quack.Quack; public class ModelDuck extends Duck {
public ModelDuck() {
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
} @Override
public void display() {
System.out.println("It is ModelDuck!!!");
} }

   飞行行为接口,以及实现类

  FlyBehavior 
package hue.edu.xiong.first.fly;

public interface FlyBehavior {
public abstract void fly();
}
  FlyNoWay 
package hue.edu.xiong.first.fly;

public class FlyNoWay implements FlyBehavior {

    @Override
public void fly() {
System.out.println("I can't fly!!");
} }

  FlyRocketPowered

package hue.edu.xiong.first.fly;

public class FlyRocketPowered implements FlyBehavior {

    @Override
public void fly() {
System.out.println("I'm flying with a rocket!!");
} }  
  FlyWithWings 
package hue.edu.xiong.first.fly;

public class FlyWithWings implements FlyBehavior {

    @Override
public void fly() {
System.out.println("I'm flying!!");
} }

  叫声接口,以及实现类

  QuackBehavior

package hue.edu.xiong.first.quack;

public interface QuackBehavior {
public abstract void quack();
}

   Quack 

package hue.edu.xiong.first.quack;

public class Quack implements QuackBehavior {

    @Override
public void quack() {
System.out.println("Quack");
} }
MuteQuack 
package hue.edu.xiong.first.quack;

public class MuteQuack implements QuackBehavior {

    @Override
public void quack() {
System.out.println("<< Silence >>");
} }
Squeak 
package hue.edu.xiong.first.quack;

public class Squeak implements QuackBehavior {

    @Override
public void quack() {
System.out.println("Squeak");
} }

四、Main类解析

 package hue.edu.xiong.first;

 import hue.edu.xiong.first.duck.Duck;
import hue.edu.xiong.first.duck.MallardDuck;
import hue.edu.xiong.first.fly.FlyNoWay;
import hue.edu.xiong.first.quack.MuteQuack; public class Main { public static void main(String[] args) {
//声明并实例化一只MallardDuck
Duck duck = new MallardDuck();
//测试已经封装的行为
duck.performFly();
duck.performQuack();
duck.display();
//更改已经封装的行为,策略模式要点
duck.setFlyBehavior(new FlyNoWay());
duck.setQuackBehavior(new MuteQuack());
//测试
duck.performFly();
duck.performQuack();
// I'm flying!!
// Quack
// It is ֻMallardDuck!!!
// I can't fly!!
// << Silence >>
} }

五、总结

策略模式是我接触到的第一个模式,很好理解,下一个模式是观察者模式

策略模式------《Head First 设计模式》的更多相关文章

  1. 《Android源码设计模式》学习笔记之ImageLoader

    微信公众号:CodingAndroid cnblog:http://www.cnblogs.com/angel88/ CSDN:http://blog.csdn.net/xinpengfei521 需 ...

  2. 《Android源码设计模式》--抽象工厂模式

    No1: 4种MediaPlayer Factory分别会生成不同的MediaPlayer基类:StagefrightPlayer.NuPlayerDriver.MidiFile和TestPlayer ...

  3. 《Android源码设计模式》--Builder模式

    No1: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 No2: 在Android源码中,最常用到的Builder模式就是AlertDialog.Builder No3: ...

  4. 《Android源码设计模式》--策略模式

    No1: 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. No2: 使用场景: 1)针对同一类型问题的多种处理方式,仅 ...

  5. 《Android源码设计模式》--模板方法模式

    No1: 模板方法模式包括:抽象类(其中定义了一系列顺序方法).具体实现类A.具体实现类B 如果子类有实现不一样的细节,重写父类的某个方法即可 No2: AsyncTask对象调用execute方法后 ...

  6. 《Android源码设计模式》--状态模式--责任链模式--解释器模式--命令模式--观察者模式--备忘录模式--迭代器模式

    [状态模式] No1: Wifi设置界面是一个叫做WifiSetting的Fragment实现的 No2: 在不同的状态下对于扫描Wifi这个请求的处理是完全不一样的.在初始状态下扫描请求被直接忽略, ...

  7. 《Android源码设计模式》--享元模式

    No1: 享元模式是对象池的一种实现.享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,来缓存可共享的对象,达到对象共享.避免创建过多对象的效果,这样一来就可以提升性能.避免内存 ...

  8. 《Android源码设计模式》--工厂方法模式

    No1: 对于一个应用程序来说,其真正的入口是在ActivityThread类中,ActivityThread中含有我们熟悉的main方法.ActivityThread是一个final类,不能被继承. ...

  9. 《Android源码设计模式》--原型模式

    No1: 原型模式使用场景: 1)类初始化需要消耗非常多的资源,这个资源包括数据.硬件资源等,通过原型复制避免这些消耗 2)通过new产生一个对象需要非常繁琐的数据准备货访问权限,这是可以使用原型模式 ...

  10. 《Android源码设计模式》--装饰模式

    No1: Activity继承于ContextThemeWrapper,继承于ContextWrapper,继承于Context. No2: Context中方法的所有实现均由ContextImpl类 ...

随机推荐

  1. get、set快捷键那码事儿

    今天发现一个省时间的方法.get一下,哈哈 在快捷get/set.或其他那个页面上的方法时,只需Shift+Alt+s 然后,选择哪个方法,就按该方法字母下有横线的那个字母(只按单个字母就行) 在ge ...

  2. Websocket --(3)实现

    今天介绍另外一种websocket实现方式,结合了spring MVC,并完善了第二节所提到做一个简单的登录认证用来识别用户的名称.界面继续沿用第二节的布局样式,同时增加上线和下线功能. 参考了 ht ...

  3. void *与id类型的相互转换

    void *与id类型相互转换 在MRC下,void *与id类型相互转换完全没问题. id obj = [[NSObject alloc] init]; void *p = (void *)p; o ...

  4. Linux系统装mycat

    最近在Linux系统中装载了一下mycut,记录过程以及所遇到的异常 首先是mycut的压缩包,直接放到linux中解压即可 链接:https://pan.baidu.com/s/1qo7z4tNvk ...

  5. 怎么编写properties文件

    1. 注释 在properties中注释是采用#号开头的方式来进行注释的 2. 编写properties文件 在properties中,一行就是一个键值对,简单的理解就是一行可以保存一个变量,键和值之 ...

  6. 去除富文本中的html标签及vue、react、微信小程序中的过滤器

    在获取富文本后,又只要显示部分内容,需要去除富文本标签,然后再截取其中一部分内容:然后就是过滤器,在微信小程序中使用还是挺多次的,在vue及react中也遇到过 1.富文本去除html标签 去除htm ...

  7. 解决Asp.Net core 控制台出现乱码的情况

    将控制台的编码页修改成Unicode,在运行程序或者在程序里加一行Console.OutputEncoding = Encoding.Unicode; Console.OutputEncoding = ...

  8. Jade学习(一)之特性、安装

    前言 流行的模板 PHP:Smarty SimpleTemplate Xtemplate Savant Java:Velocity FreeMarker Jbyte C#:Dotiquid Sharp ...

  9. jsp-TagLib标签库

    <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ t ...

  10. func_get_args func_num_args 的使用

    func_get_args是获取方法中参数的数组,返回的是一个数组,与func_num_args搭配使用: func_num_args一般写在方法中,用于计数 function eeee($a='gg ...