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 条评论
登录 后参与评论

相关文章

来自专栏杨龙飞前端

scrollto 到指定位置

2494
来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

3985
来自专栏转载gongluck的CSDN博客

cocos2dx 打灰机

#include "GamePlane.h" #include "PlaneSprite.h" #include "BulletNode.h" #include...

5346
来自专栏芋道源码1024

熔断器 Hystrix 源码解析 —— 断路器 HystrixCircuitBreaker

本文主要基于 Hystrix 1.5.X 版本 1. 概述 2. HystrixCircuitBreaker 3. HystrixCircuitBreaker....

5287
来自专栏Ceph对象存储方案

Luminous版本PG 分布调优

Luminous版本开始新增的balancer模块在PG分布优化方面效果非常明显,操作也非常简便,强烈推荐各位在集群上线之前进行这一操作,能够极大的提升整个集群...

3095
来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

2697
来自专栏闻道于事

js登录滑动验证,不滑动无法登陆

js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html...

6688
来自专栏一个爱瞎折腾的程序猿

sqlserver使用存储过程跟踪SQL

USE [master] GO /****** Object: StoredProcedure [dbo].[sp_perfworkload_trace_s...

2000
来自专栏我和未来有约会

Kit 3D 更新

Kit3D is a 3D graphics engine written for Microsoft Silverlight. Kit3D was inita...

2506
来自专栏大内老A

The .NET of Tomorrow

Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciti...

30910

扫码关注云+社区