Java经典23种设计模式之行为型模式(一)

行为型设计模式有11种,分别是Chain of Responsibility ( 责任链模式 )、Command ( 命令模式 )、Interpreter ( 解释器模式 ) 、Iterator ( 迭代器模式 )、Mediator ( 中介者模式 ) 、Memento ( 备忘录模式 ) 、Observer ( 观察者模式 )、State ( 状态模式 ) 、Strategy ( 策略模式 )、TemplateMethod ( 模板方法 )、Visitor ( 访问者模式 ),本文介绍这11种行为型模式里的前两种。

一、责任链模式

使多个对象都有机会处理请求,从而避免请求的 发送者和接受者之间的耦合。将这些对象连成一个链,并按着这个链传递该请求,直到有一个对象处理他为止。先来看一个简单的例子:

1、Handler 定义一个处理请求的接口。(可选)实现后继链。

public interface RequestHandle {
    void handleRequest(Request request);
}

2.ConcreteHandler  处理它所负责的请求。可访问它的后继者。如果可处理该请求,就处理;否则将该请求转发给它的后继者。

public class HRRequestHandle implements RequestHandle {

public void handleRequest(Request request) {
        if (request instanceof DimissionRequest) {
            System.out.println("要离职, 人事审批!");
        } 
        System.out.println("请求完*");
    }
}

接下来这两种ConcreteHandler不仅可以处理负责的请求,还可以将请求转发给他的后继者。

public class PMRequestHandle implements RequestHandle {

    Req*estHandle rh;

    public PMRequestHandle(RequestHandle *h) {
        this.rh = rh;
    }

    public void handle*equest(Request request) {
        if (request instanceof AddMoneyRequest) {
            System.out.println("要加薪, 项目经理审批!*);
        } else {
            rh.handleRequest(request);
        }
    }
}

public class TLRequestHandle implements RequestHandle {

    RequestHandle rh;

    public TLRequestHandle(RequestHand*e rh) {
        this.rh = rh;
    }

    public void handleRequest(Request request) {
        if (request instanceof LeaveRe*uest) {
            System.ou*.println("要请假, 项目组长审批!");
        } else {
            rh.handleRequest(request);
        }
    }
}

3.Client   向链上的具体处理者(ConcreteHandler)对象提交请求。

public class Test {
    public static void main(String[] args) {
        RequestHa*dle hr = *ew HRRequ*stHandle();
        Requ*stHandle pm = new P*RequestHandle(hr);
        RequestHandle tl = new TLRequestHandle(pm);

        //team leader处理离职请求
        Request request = new DimissionRequest()*
        tl.handleRequest(request);

        System.out.println("===========");
        //team leader处理加薪请求
        request = new AddMoneyRequest();
        tl.handleRequ*st(request);

        System.out.println("========");
        //项目经理上理辞职请求
        requ*st = ne* Dimissio*Request();
        pm.handleRequest(request);
    }
}

运行结果:

要离职, 人事审批!
请求完毕
=======*===
要加薪, 项目经理审批!
========
要离职, 人事审批!
请求完毕
简单分析下这段测试代码,前面三句话new了三个不同的实体RequestHandler,在pm tl里分别给他传递了他的后继者。pm的后继者是hr,tl的后继者是pm。所谓的后继者,就是当前请求你处理不了的话,让谁接着处理这个请求。然后new了一个DimissionRequest的请求,让tl来处理,很显然tl不处理,tl就让pm来处理。pm也不管,让hr管。最终hr的handleMessage里处理了该请求。后面的都类似,不说了。

这个责任链模式很像击鼓传花这个游戏,详见链接的分析。

适用性:
    1.有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
    2.你*在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
    3.可处理一个请求的对象集合应被动态指定。

二、命令模式

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。

1.Receiver
      知道如何实*与执行一个请求相关的操作。任何类都可能作为一个接收者。

public class Receiver {

public void receive() {
        System.out.println("This is Receive class!");
    }
}

2、Command      声明执行操作的接口。

public abstract class command {
    
    protected Receiver receiver;
    
    public Command(Receiver receiver) {
        this.receiver = receiver;
    }
    
    public abstract void execute();
}

3、 ConcreteCommand  将一个接收者对象绑定于一个动作。 调用接收者相应的操作,以实现Execute。

public class CommandImpl extends Comman* {

public CommandImpl(Receiv*r receiver) {
        super(receiver);
    }
    
    pu*lic void *xecute*) {
        receiver.request();
    }
}

4、Invoker 要求该命令执行这个请求。

public class Invoker {

private Command command;
    
    public void setCommand(Command command) {
        this.command = command;
    }
    
    public void execute() {
        command.execute();
    }
}

测试代码:

public class Test {

public static void main (String[] args) {
        Receiver rec = new Receiver();
        Command cmd = new CommandImpl(rec);
        Invoker i = new Invoker();
        i.setCommand(cmd);
        i.execute();
    }
}

适用性
    1.抽象出待执行的动作以参数化某对象。
    2.在不同的时刻指定、排列和执行请求。
    3.支持取消操作。
    4.支持修改日志,这样当系统崩溃时,这*修改可以被重做一遍。
    5.用构建在原语操作上的高层操作构造一个系统。

命令模式参考链接:http://www.cnblogs.com/devinzhang/archive/2012/01/06/2315235.html

Java经典23种设计模式之行为型模式(一)

时间: 2024-10-27 01:11:37

Java经典23种设计模式之行为型模式(一)的相关文章

Java经典23种设计模式之行为型模式(三)

本文接着介绍11种行为型模式里的备忘录模式.观察者模式.状态模式. 一.备忘录模式 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先保存的状态.还是比较好理解的. 1.Memento 备忘录存储原发器对象的内部状态,这个类就是要存储的对象的状态.状态需要多少个变量,在Memento里就写多少个变量. public class Memento { private String state; public Meme*to(String st

Java经典23种设计模式之行为型模式(二)

本文接着介绍行为型模式里的解释器模式.迭代器模式.中介者模式. 一.解释器模式Interpret 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言的中的句子. 1.AbstractExpression(抽象表达式) 声明一个抽象的解释操作,这个接口为抽象语法树中全部的节点所共享. public abstract class Expression {    abstract void interpret(Context ctx);} 2.Expression

Java经典23种设计模式之行为型模式(四)

本文介绍11种行为型设计模式里的策略模式.模板方法.访问者模式. 一.策略模式 定义一系列的算法,把它们每个封装起来,并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 1.Strategy定义所有支持的算法的公共接口.Context使用这个接口来调用某ConcreteStrategy定义的算法. public abstract class Strategy {    public abstract void method();} 2.ConcreteStrategy以Strate

Java经典23种设计模式之结构型模式(三)------附代理模式、适配器模式、外观模式区别

本文介绍7种结构型模式里的剩下两种:享元模式.代理模式. 一.享元模式FlyWeight 享元模式比较简单且重要,在很多场合都被用到,只不过封装起来了用户看不到.其概念:运用共享内存技术最大限度的支持大量细粒度的对象.这个概念给的有些抽象,说白了就是如果内存中存在某个对象A,如果再次需要使用对象A的时候如果内存中有A这个对象就直接使用它,不要再次new了.如果没有,则重新new一个.基于这个特点,享元模式使用时一般会给待访问对象传递一个Tag,用来标识这个对象,而且要同时使用抽象工厂的方法进行访

Java经典23种设计模式之结构型模式(一)

结构型模式包括7种:适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式. 本文主要介绍适配器模式和桥接模式. 一.适配器模式(Adapter) 适配器模式其实很简单,就像手机充电器一样,手机需要5V的,而插座出来是220V.因此需要充电器变压就ok.再比如,一个之会说汉语的和一个只会说英语的无法沟通,那就中间请个翻译.所有的交流通过翻译,翻译翻给会说英语的,就能完成一次单项交流的.链接1 中的例子非常生动形象了.总结一下,无非就是有个通用的接口(称为Target),如果一切顺

Java经典23种设计模式之结构型模式(二)

接上篇,本文介绍结构型模式里的组合模式.装饰模式.外观模式. 一.组合模式(Composite) 组合模式:将对象组合成树形结构,表示"部分--整体"的层次结构.最终达到单个对象和组合对象的使用具有一致性.单看这句话貌似有点抽象,其实比较简单. 以李云龙的独立团为例,目的要统计赵嘉宇一战共歼灭敌人多少个.最高的级别是团,一个团有若干个营,一个营有若干个排,一个排有若干个战士.(为了简化问题,排下面就不设行政单位了).很自然的,李云龙给营长开会回去给老子统计.营长回去给各个排长开会,赶紧

java中23种设计模式之18-原型模式(Prototype pattern)

class Something{ public String something=null;}class Prototype implements Cloneable{ private String name; public Something aSomething=new Something(); public void setName(String name) { this.name=name; } public String getName() { return name; } publi

Java经典23种设计模式之创造型模式(二)

本文记录5种创造型模式的剩下两种:建造者模式(Builder).原型模式(PROTOTYPE). 一.建造者模式(别名:生成者模式) 将复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示.一个完整的建造者模式包含以下几个概念: 1.产品类 Product public class Person { private String head; private String body; private String foot; public String getHead() { ret

Java经典23种设计模式之创造型模式(一)

设计模式被称为程序猿的内功,之前零零散散的看过一大部分,但自己么有总结过.故此次在这里总结下.值得一提的是,设计模式并不是Java所特有.由于一直搞Android.这里就用Java为载体.最经典的设计模式有23种,分三个大类型: 创建型模式(5) .结构型模式(7).行为型模式(11),5 + 7 +11 = 23.网上一搜也都是一大把了,这里不过个人作的记录.本文记录创造型模式里的工厂方法(Factory Method).抽象工厂(Abstract Factory).单例模式这三种.力求透彻.