设计模式大类--行为模式(上)

  大概有10中行为模式,分为上中下三篇。
一、Template(模板)
描述:定义一些操作算法的骨架,将其实现延迟到其子类
好处:扩展性强

例子:
Java的抽象类本来就是Template模式,因此使用很普遍.而且很容易理解和使用,我们直接以示例开始:

public abstract class Benchmark
{
  /**
  *
下面操作是我们希望在子类中完成
  */
  public abstract void benchmark();

  /**
  * 重复执行benchmark次数
  */
  public final long repeat (int
count) {
    if (count <= 0)
      return 0;
    else
{
      long startTime = System.currentTimeMillis();

    for (int i = 0; i < count; i++)
      benchmark();

    long stopTime = System.currentTimeMillis();
    return stopTime -
startTime;
  }
}
}

在上例中,我们希望重复执行benchmark()操作,但是对benchmark()的具体内容没有说明,而是延迟到其子类中描述:

public class MethodBenchmark extends Benchmark
{
  /**
  *
真正定义benchmark内容
  */
  public void benchmark() {

    for (int i = 0; i < Integer.MAX_VALUE; i++){
   
  System.out.printtln("i="+i);    
    }
  }
}

至此,Template模式已经完成,是不是很简单?看看如何使用:

Benchmark operation = new MethodBenchmark();
long duration =
operation.repeat(Integer.parseInt(args[0].trim()));
System.out.println("The
operation took " + duration + " milliseconds");

二、Memento(备忘录)
描述:保存另外一个对象内部状态拷贝的对象.这样以后就可以将该对象恢复到原先保存的状态
好处:要保存的细节给封装在了Memento中,不对外暴露封装的细节,哪一天要改保存的细节也不用影响客户端了

例子:
public class Originator {

   private int number;

  private File file = null;

  public Originator(){}

  // 创建一个Memento
  public Memento getMemento(){
    return new
Memento(this);
  }

  // 恢复到原始值
  public void setMemento(Memento m){
     number =
m.number;
     file = m.file;
  }

}

我们再看看Memento类:

private class Memento implements java.io.Serializable{

  private int number;

  private File file = null;

  public Memento( Originator o){

    number = o.number;
    file = o.file;

  }

}

可见 Memento中保存了Originator中的number和file的值.
通过调用Originator中number和file值改变的话,通过调用setMemento()方法可以恢复.

Memento模式的缺点是耗费大,如果内部状态很多,再保存一份,无意要浪费大量内存.

三、Observer(观察者)
描述:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己
好处:观察者模式在被观察者和观察者之间建立一个抽象的耦合;观察者模式支持广播通讯。被观察者会向所有的登记过的观察者发出通知。

例子:
首先定义抽象的观察者:

//抽象观察者角色
public interface Watcher
{
public void update(String
str);

}
  然后定义抽象的主题角色,即抽象的被观察者,在其中声明方法(添加、移除观察者,通知观察者):

//抽象主题角色,watched:被观察
public interface Watched
{
public void
addWatcher(Watcher watcher);

public void removeWatcher(Watcher watcher);

public void notifyWatchers(String str);

}

  然后定义具体的观察者:

public class ConcreteWatcher implements Watcher
{

@Override
public void update(String str)
{

System.out.println(str);
}

}

  之后是具体的主题角色: 

import java.util.ArrayList;
import java.util.List;

public class ConcreteWatched implements Watched
{
//
存放观察者
private List<Watcher> list = new ArrayList<Watcher>();

@Override
public void addWatcher(Watcher watcher)
{

list.add(watcher);
}

@Override
public void removeWatcher(Watcher watcher)
{

list.remove(watcher);
}

@Override
public void notifyWatchers(String str)
{

// 自动调用实际上是主题进行调用的
for (Watcher watcher : list)
{

watcher.update(str);
}
}

}

  编写测试类:

public class Test
{
public static void main(String[] args)

{
Watched girl = new ConcreteWatched();

Watcher
watcher1 = new ConcreteWatcher();
Watcher watcher2 = new
ConcreteWatcher();
Watcher watcher3 = new ConcreteWatcher();

girl.addWatcher(watcher1);
girl.addWatcher(watcher2);

girl.addWatcher(watcher3);

girl.notifyWatchers("开心");

}

}

设计模式大类--行为模式(上),布布扣,bubuko.com

时间: 2024-12-11 07:27:06

设计模式大类--行为模式(上)的相关文章

设计模式大类--结构模式(上)

大概有7中结构模式,分为上下两篇.一.Adapter(适配器)描述:将两个不兼容的类结合一起使用,一般需要用到其中某个类的若干方法好处:在两个类直接创建一个混合接口,而不必修改类里面的其他代码 例子:假设我们要打桩,有两种类:方形桩 圆形桩.public class SquarePeg{ public void insert(String str){ System.out.println("SquarePeg insert():"+str); } } public class Roun

设计模式大类--结构模式(下)

五.Decorate(装饰者)描述:动态的给一个对象添加额外的职责,比继承达到更好的灵活性好处:某些功能需要用户动态决定加入方式和时机,装饰者提供即插即用的模型 例子:举Adapter中的打桩示例,在Adapter中有两种类:方形桩 圆形桩,Adapter模式展示如何综合使用这两个类,在Decorator模式中,我们是要在打桩时增加一些额外功能,比如,挖坑 在桩上钉木板等,不关心如何使用两个不相关的类我们先建立一个接口:public interface Work{ public void ins

设计模式大类--行为模式(中)

四.Chain of Responsibility(责任链)描述:一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯一共同点是在他们之间传递request. 也就是说,来了一个请求,A类先处理,如果没有处理,就传递到B类处理,如果没有处理,就传递到C类处理,就这样象一个链条(chain)一样传递下去好处:降低了类之间的耦合性 例子:抽象处理者角色public abstract class Handler { /** * 持有后继的责任对象*/protecte

设计模式大类--行为模式(下)

七.Strategy(策略模式)描述:定义了一系列的算法,将每一种算法封装起来并可以相互替换使用,策略模式让算法独立于使用它的客户应用而独立变化.优点:各个部分之间是弱连接 的关系,弱连接的特性使软件具有更强的可扩展性 ,易于维护 :更重要的是,它大大提高了软件可重用性 . 例子:举例(TreeSet .TreeMap就是很好的例子 )public class Test { /*客户端*/ public static void main(String[] args) { //面向接口 Strat

设计模式之创建型模式(上)

没有总结的学习不算学习,这一个月的学习可谓收获多多啊,接下来与大家分享一下. 一.设计模式的分类 总体来说设计模式分为三大类: 1.创建型模式,共五种. 2.结构型模式,共七种. 3.行为型模式,共十一种. 首先研究创建型模式 二. 概述 创建型模式,就是用来创建对象的模式,抽象了实例化的过程.它帮助一个系统独 立于如何创建.组合和表示它的那些对象. 三. 为什么需要创建型模式 所有的创建型模式都有两个永恒的主旋律: 第一,它们都将系统使用哪些具体类的信息封装起来: 第二,它们隐藏了这些类的实例

设计模式——介绍与工厂模式(扁平管理模式VS职业经理人模式)

本文主要对设计模式进行大概解说.特别是对工厂模式进行简明的解析: 一.设计模式的分类 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.訪问者模式.中介者模式.解释器模式. 事实上还有两类:并发型模式和线程池模式. 二.设计模式的六大原则 1.开闭原则(Op

设计模式4 结构型模式

设计模式4  结构型模式 目录 代理模式 装饰器 外观模式 适配器模式 代理模式,美国,韩国代理购物 [email protected]:~$ cat main.cpp  #include<iostream> using namespace std; class Item //商品 { public: Item(string kind ,bool fact) { this->kind = kind; this->fact = fact; } string getKind() { r

java_设计模式_装饰者模式_Decorator Pattern(2016-07-28)

装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的结构 装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任.换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同.装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展. 装饰模式的类图如下: 在装饰模式中的角色有: ● 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象. ● 具体构件(ConcreteComponent)角色

PHP设计模式之备忘模式

1.Norton Ghost的方便与问题 我们大多数win的用户都用过Norton Ghost,只要将目前系统备份一下生成镜像文件,等系统中毒或崩溃的时候,用Norton Ghost恢复一下就回到备份时候的样子了. 这个可以说就是备忘(Memento)模式的基本原理了,先备份,需要的时候恢复.因此备忘模式是比较好理解的. 但在实际应用中,如何正确的应用备忘模式,是需要注意的. 难道我们在word写文章的时候,先要Ghost备份一下所有的硬盘,一旦文章写错了,需要恢复,就用Ghost覆盖硬盘? 就