专栏首页Java大联盟23种设计模式详解(六)

23种设计模式详解(六)

1.中介者模式(Mediator)

中介者模式也是用来降低类类之间的耦合的,因为如果类类之间有依赖关系的话,不利于功能的拓展和维护,因为只要修改一个对象,其它关联的对象都得进行修改。如果使用中介者模式,只需关心和Mediator类的关系,具体类类之间的关系及调度交给Mediator就行,这有点像spring容器的作用。

User接口:

public abstract class User {
    private Mediator mediator;

    public Mediator getMediator() {
        return mediator;
    }

    public User(Mediator mediator) {

        this.mediator = mediator;
    }
    public abstract void work();

}

User1:

public class User1 extends User {
    public User1(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void work() {
        System.out.println("user1 exe....");
    }
}

User2:

public class User2 extends User {
    public User2(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void work() {
        System.out.println("user2 exe....");
    }
}

中介接口:

public interface Mediator {
    public void creatMediator();
    public void allWorkers();
}

中介实现:

public class myMediator implements Mediator{
    private User1 user1;
    private User2 user2;

    public User2 getUser2() {
        return user2;
    }

    public User1 getUser1() {

        return user1;
    }

    @Override
    public void creatMediator() {
        user1=new User1(this);
        user2=new User2(this);
    }

    @Override
    public void allWorkers() {
        user1.work();
        user2.work();
    }
}

测试:

public class Test {
    public static void main(String[] args){
        Mediator mediator=new myMediator();
        mediator.creatMediator();
        mediator.allWorkers();
    }
}

结果:

2.解释器模式(Interpreter Pattern)

解释器模式是我们暂时的最后一讲,一般主要应用在OOP开发中的编译器的开发中,所以适用面比较窄。

上下文环境类:

public class Context {
    private int num1;
    private int num2;

    public Context(int num1,int num2) {
        this.num1 = num1;
        this.num2 = num2;
    }

    public int getNum2() {
        return num2;
    }

    public void setNum2(int num2) {
        this.num2 = num2;
    }

    public int getNum1() {

        return num1;
    }

    public void setNum1(int num1) {
        this.num1 = num1;
    }
}

计算接口:

public interface Expression {
    public int expression(Context context);
}

实现类:

public class Plus implements Expression{
    @Override
    public int expression(Context context) {
        return context.getNum1()+context.getNum2();
    }
}



public class Minus implements Expression{
    @Override
    public int expression(Context context) {
        return context.getNum1()-context.getNum2();
    }
}

测试:

public class Test {
    public static void main(String[] args){
        //21+22-2
        int result=new Minus().expression(new Context(new Plus().expression(new Context(21,22)),2));
        System.out.println(result);
    }
}

结果:

3.备忘录模式(Memento)

主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人觉得叫备份模式更形象些,通俗的讲下:假设有原始类A,A中有各种属性,A可以决定需要备份的属性,备忘录类B是用来存储A的一些内部状态,类C呢,就是一个用来存储备忘录的,且只能存储,不能修改等操作。

原始类A:

public class A {
    private String Value;
    private B b;

    public A(String value) {
        Value = value;
    }
    public String getValue() {
        return Value;
    }
    public void setValue(String value) {
        Value = value;
    }
    public B creatB(){
        return new B(Value);
    }
    public void restoreB(B b){
        this.Value=b.getValue();
    }

}

备忘录B:

public class B {
    private String value;
    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public B(String value) {
        this.value = value;
    }
}

存储备忘录的类C:

public class C {
    private B b;

    public B getB() {
        return b;
    }

    public void setB(B b) {
        this.b = b;
    }

    public C(B b) {

        this.b = b;
    }
}

测试:

public class Test {
    public static void main(String[] args){
        //创建原始类
        A a=new A("water");
        //创建备忘录
       C c=new C(a.creatB());
        //修改原始类的状态
        a.setValue("ice");
        //恢复原始类的状态
        a.restoreB(c.getB());
    }
}

结果:

源码:

链接: https://pan.baidu.com/s/1RXJLKsQ0z7TBx0hXeUqM3Q

密码: 4mgb

本文分享自微信公众号 - Java大联盟(javaunion)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-05-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 23种设计模式详解(三)

    模板方法模式就是指:一个抽象类中,有一个主方法,再定义1...n个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类...

    南风
  • 23种设计模式详解(三)

    南风
  • 23种设计模式详解(五)

    南风
  • (52) 抽象容器类 / 计算机程序的思维逻辑

    查看历史文章,请点击上方链接关注公众号。 从38节到51节,我们介绍的都是具体的容器类,上节我们提到,所有具体容器类其实都不是从头构建的,它们都继承了一些抽象容...

    swiftma
  • 依赖注入容器-- Autofac

    Autofac---Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上非常高...

    小世界的野孩子
  • 代理模式

    mySoul
  • Head First设计模式——蝇量模式和解释器模式

    在一个设计房子的平台中,周围要加上一些树,树有一个坐标XY坐标位置,而且可以根据树的年龄动态将自己绘制出来。如果我们创建许多树之后,会有许多树的实例对象。使用一...

    SpringSun
  • Java面向对象之抽象类,接口

    抽象类: 含有抽象方法的类被声明为抽象类 抽象方法由子类去实现 含有抽象方法的类必须被声明为抽象类 抽象类被子类继承,子类(如果不是抽象类)必须重写抽象类中...

    二十三年蝉
  • 第76节:Java中的基础知识

    设置环境,安装操作系统,安装备份,就是镜像,jdk配置环境,eclipse下载解压即可使用,下载tomcat

    达达前端
  • Java 接口

    但如果三角形类不需要draw()方法,只能去掉图形类中的draw()或把draw()变成图形类私有

    用户2965768

扫码关注云+社区

领取腾讯云代金券