本文接着介绍行为型模式里的解释器模式、迭代器模式、中介者模式。

一、解释器模式Interpret

给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言的中的句子.

1.AbstractExpression(抽象表达式) 声明一个抽象的解释操作,这个接口为抽象语法树中全部的节点所共享。

public abstract class Expression {
    abstract void interpret(Context ctx);
}

2.Expression 实现与文法中的终结符相关联的解释操作。

public class AdvanceExpression extends Expression {

    void interpret(Context ctx) {
System.out.println("这是高级解析器!");
}
} public class SimpleExpression extends Expression { void interpret(Context ctx) {
System.out.println("这是普通解析器!");
}
}

3.Context(上下文) 包括解释器之外的一些全局信息。

public class Context {

    private String content;

    private List list = new ArrayList();

    public void setContent(String content) {
this.content = content;
} pu*lic String getContent() {
return this.content;
} public void add(Expression eps) {
list.add(eps);
} public List getList() {
return list;
}
}

測试代码:

public class Test {

public static void main(String[] args) {
        Context ctx = new Context();
        ctx.add(new SimpleExpression());
        ctx.add(new AdvanceExpression());
        ctx.add(new SimpleExpression());
        
        for (Expression eps : ctx.getList()) {
            eps.interpret(ctx);
        }
    }
}
result 
这是普通解析器!
这是高级解析器!
这是普通解析器!

适用性:
    当有一个语言须要解释运行,而且你可将该语言中的句子表示为一个抽象语法树时,可使
    用解释器模式。而当存在*下情况时该模式效果最好:
    1.该文法简单对于复杂的文法,文法的*层次变得庞大而无法管理。

2.效率不是一个关键问题最高效的解释器通常不是通过直接解释语法分析树实现的,而是首先将它们转换成还有一种形式。

这个样例还是不够典型的,能够參考链接http://blog.csdn.net/feier7501/article/details/8604151里的样例。

二、迭代器模式Interator

提供一种方法訪问一个容器对象中的各个元素。而又不暴漏该对象的内部细节。号称是Java里使用最多的模式。

1.Iterator 迭代器定义訪问和遍历元素的接口。

public interface Iterator {

Object next();
    
    void first();
    
    void last();
    
    boolean hasNext();
}

2.ConcreteIterator详细迭代器实现迭代器接口。对该聚合遍历时跟踪当前位置。

public class IteratorImpl implements Iterator {

    private List list;

    private int index;

    public Ite*atorImpl(List list* {
index = 0;
this.list = list;
} public void first() {
index = 0;
} public void last() {
index = list.getSize();
} public Object next() {
Object obj = list.get(index);
index++;
ret*rn obj;
} public boolean hasNext() {
return index < list.getSize();
}
}

3.Aggregate聚合定义创建对应迭代器对象的接口。

public interface List {

    Iterator iterator();

Object get(int index);
    
    int getSize();
    
    void add(Object obj);
}

4.ConcreteAggregate详细聚合实现创建对应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例.

public class ListImpl implements List {

    private Object[] list;

    private int index;

    private int size;

    public ListImpl() {
index = 0;
size = 0;
list = new Object[100];
} public Iterator iterator() {
return new IteratorImpl(this);
} public O*ject get(int index) {
return list[index];
} public int getSize() {
return this.size;
} public void add(Object obj) {
list[index++] = obj;
size++;
}
}

測试代码:

public class Test {

    public stati* void main(String[] arg*) {
List list = new ListImpl();
list.add("a");
list.add("b");
list.add("c");
//第一种迭代方式
Iterator it = list.iterator();
while (*t.ha*Next()) {
S*stem.out.println(it.next());
} Syst*m.out.println("=====");
//另外一种迭代方式
for (int i = 0; i < list.getSize(); i++) {
System.out.println(list.get(i));
}
}
}

适用性:

1.訪问一个聚合对象的内容而无需暴露它的内部表示。
2.支持对聚合对象的多种遍历。

3.为遍历不同的聚合结构提供一*统一的接口(即,支持多态迭代)。

迭代器模式非经常常使用。java本身已经提供了完美的支持,很多其它可见链接:http://blog.csdn.net/chenhuade85/article/details/8146992

三、中介者模式

用一个中介对象来封装一系列的对象交互。中介者使各对象不须要显式地相互引用。从而使其耦合松散,而且能够独立地改变它们之间的交互。

1.Mediator
      中介者定义一个接口用于与各同事(Colleague)对象通信。

public abstract class Mediator {

public abstract void notice(String content);
}

2.ConcreteMediator详细中介者通过协调各同事对象实现协作行为。了解并维护它的各个同事。

public *lass ConcreteMediator e*tends Mediator {

private ColleagueA ca;
    
    pri*ate ColleagueB cb;
    
    public ConcreteMediator() {
        ca = new ColleagueA();
        cb = new Col*eagueB();
    }
    
    public void no*ice(String content) {
        if (co*tent.equals("boss")) {
            //老板来了, 通知员工A
            ca*action();
        }
        if (content.equals("client")) {
            //客户来了, *知前台B
            cb.action();
        }
    }
}

3.Colleagueclass每个同事类都知道它的中介者对象。

每个同事对象在需与其它的同事通信的时候*与它的中介者通信。

public class ColleagueA extends Colleague {

public void action() {
        System.out.println("普通员工努力工作");
    }
}

public class ColleagueB extends Colleague {

public void action() {
        System.out.println("前台注意了!");
    }
}

測试代码:
public class Test {

public static void main(String[] args) {
        Mediator med = new ConcreteMediator();
        //老板来了
        med.notice("boss");
        
        //客户来了
        med.notice("client");
    }
}
result

普通员工努力工作
前台注意了!

适用性:

1.一组对象以定义良好可是复杂的方式进行通信。

产生的相互依赖关系结构混乱且难以理解。
2.一个对象引用其它非常多对象而且直接与这些对象通信,导致难以复*该对象。

3.想定制一个分布在多个类中的行为。*又不想生成太多的子类。

很多其它可參考链接:http://blog.csdn.net/chenhuade85/article/details/8141831

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

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

    本文接着介绍11种行为型模式里的备忘录模式.观察者模式.状态模式. 一.备忘录模式 在不破坏封装性的前提下,捕获一个对象的内部状态.并在该对象之外保存这个状态.这样以后就能够将该对象恢复到原先保存的状 ...

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

    结构型模式包含7种:适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式. 本文主要介绍适配器模式和桥接模式. 一.适配器模式(Adapter) 适配器模式事实上非常easy.就像手 ...

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

    设计模式被称为程序猿的内功,之前零零散散的看过一大部分,但自己么有总结过.故此次在这里总结下.值得一提的是,设计模式并不是Java所特有.由于一直搞Android.这里就用Java为载体.最经典的设计 ...

  4. GoF的23种设计模式之创建型模式的特点和分类

    创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”.这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的工厂来完成.就像我们去商场购买商品时, ...

  5. GoF的23种设计模式之行为型模式的特点和分类(2)

    行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配. 行为型模式分为类行为模式和对象行为模式,前者采用继 ...

  6. GoF的23种设计模式之行为型模式的特点和分类(1)

    行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配. 行为型模式分为类行为模式和对象行为模式,前者采用继 ...

  7. Java的23种设计模式,详细讲解(二)

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...

  8. Java中23种设计模式(附代码样例)

    一.设计模式分类总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式.结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组 ...

  9. 从追MM谈Java的23种设计模式(转)

    从追MM谈Java的23种设计模式    这个是从某个文章转载过来的.但是忘了原文链接.如果知道的,我追加一下. 1.FACTORY-追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西 ...

随机推荐

  1. HDU 4431 Mahjong 模拟

    http://acm.hdu.edu.cn/showproblem.php?pid=4431 不能说是水题了,具体实现还是很恶心的...几乎优化到哭但是DFS(还加了几个剪枝)还是不行...搜索一直T ...

  2. 为什么linux驱动中变量或者函数都用static修饰?(知乎问题)

    static定义的全局变量 或函数也只能作用于当前的文件. 世界硬件厂商太多,定义static为了防止变量或 函数 重名,定义成static, 就算不同硬件驱动中的 变更 或函数重名了也没关系 .

  3. 51nod 最长公共子序列+输出路径

    当x = 0 或 y = 0时 f[x][y] = 0 当a[x] = b[y]时  f[x][y] = f[x-1][y-1]+1 当a[x] != b[y]时 f[x][y] = max(f[x] ...

  4. 洛谷——P2446 [SDOI2010]大陆争霸

    https://www.luogu.org/problem/show?pid=2446#sub 题目背景 在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的克里斯国.两个国家的人民分别 ...

  5. 黑马程序猿——JAVA面向对象的特性:封装,继承,多态

                                           - ----------android培训.java培训.java学习型技术博客.期待与您交流!------------  ...

  6. Markdown---语法小记

    在CSDN上的文章如今都习惯使用Markdown来编写比較方便美观.这里小结下常见的Markdown语法下: 1.标题: 方式1 # H1 ## H2 ### H3 #### H4 ##### H5 ...

  7. Extjs在HtmlEditor的工具栏上插入自定义按钮

    Ext.ns('Ext.ux.form.HtmlEditor');Ext.ux.form.HtmlEditor.HR =Ext.extend(Ext.util.Observable,{ init:fu ...

  8. Socket编程中的强制关闭与优雅关闭及相关socket选项

    以下描述主要是针对windows平台下的TCP socket而言. 首先需要区分一下关闭socket和关闭TCP连接的区别,关闭TCP连接是指TCP协议层的东西,就是两个TCP端之间交换了一些协议包( ...

  9. JS中的预解析

    js预解析对于很多学习web前端开发的新手们很困扰,总是很难搞懂到底是个什么东西,今天零度就为大家简单的分析一下,争取让大家都明白! 首先,看一下下面的代码: alert(a); var a = 1; ...

  10. SQL事务+异常

    BEGIN TRAN BEGIN TRY --这里写代码 --这里写代码 END TRY BEGIN CATCH ROLLBACK TRAN END CATCH COMMIT TRAN