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

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

一、解释器模式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

时间: 2024-10-06 13:58:02

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

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

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

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

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

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

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

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种设计模式之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).单例模式这三种.力求透彻.