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)

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏图像识别与深度学习

蓝牙项目开发心得

3429
来自专栏大内老A

WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用

如果一个类型,不一定是数据契约,和给定的数据契约具有很大的差异,而我们要将该类型的对象序列化成基于数据契约对应的XML。反之,对于一段给定的基于数据契约的XML...

1937
来自专栏IT开发技术与工作效率

VBA导入

1735
来自专栏我的小碗汤

golang 设置 http response 响应头与坑

之前遇到个问题,在一段代码中这样设置WriteHeader,最后在header中取Name时怎么也取不到。

912
来自专栏mathor

引入BootStrap开发一个JSP项目

 首先去BootStrap中文官网阅读BootStrap的相关说明,以及下载BootStrap样式

1.1K2
来自专栏人工智能LeadAI

资源安全

在所有异常分之里记得释放资源,存在较为严重的安全隐患。此处,引入ScopedExit的封装,使用C++特有的RAII机制,在析构函数中完成资源的安全释放;即使程...

892
来自专栏jeremy的技术点滴

JVM的Finalization Delay引起的OOM

4038
来自专栏wannshan(javaer,RPC)

dubbo通信消息解析过程分析(1)

由于rpc底层涉及网络编程接口,线程模型,网络数据结构,服务协议,细到字节的处理。牵涉内容较多,今天就先从一个点说起。 说说,dubbo通过netty框架做传...

5166
来自专栏码匠的流水账

No thread-bound request found异常

本文主要研究下spring mvc的No thread-bound request found异常

2780
来自专栏技术与生活

设计模式-备忘录模式

备忘录角色对如何其他对象提供一个接口,也就是宽接口的话,那么备忘录角色存储的内部状态都暴露给其他对象。这种情况导致发起人的状态都没看到,是破坏封装性的,只能通过...

1052

扫码关注云+社区

领取腾讯云代金券