zoukankan      html  css  js  c++  java
  • 设计模式18-中介者模式

    1. 概念

        用一个中介对象封装一些列的对象交互

    2. 案例

        实现下面的案例

        类A和B,类中各有一个数字,要保证类B中的数字永远是类A中数字的100倍。即:当修改类A的数时,将这个数字乘以100赋给类B,而修改类B时,要将数除以100赋给类A。类A类B互相影响,

    就称为同事类 . 

        如果不使用中介者模式的代码如下: 

    abstract class AbstractColleague {  
        protected int number;  
      
        public int getNumber() {  
            return number;  
        }  
      
        public void setNumber(int number){  
            this.number = number;  
        }  
        //抽象方法,修改数字时同时修改关联对象  
        public abstract void setNumber(int number, AbstractColleague coll);  
    }  
      
    class ColleagueA extends AbstractColleague{  
        public void setNumber(int number, AbstractColleague coll) {  
            this.number = number;  
            coll.setNumber(number*100);  
        }  
    }  
      
    class ColleagueB extends AbstractColleague{  
          
        public void setNumber(int number, AbstractColleague coll) {  
            this.number = number;  
            coll.setNumber(number/100);  
        }  
    }  
      
    public class Client {  
        public static void main(String[] args){  
      
            AbstractColleague collA = new ColleagueA();  
            AbstractColleague collB = new ColleagueB();  
              
            System.out.println("==========设置A影响B==========");  
            collA.setNumber(1288, collB);  
            System.out.println("collA的number值:"+collA.getNumber());  
            System.out.println("collB的number值:"+collB.getNumber());  
      
            System.out.println("==========设置B影响A==========");  
            collB.setNumber(87635, collA);  
            System.out.println("collB的number值:"+collB.getNumber());  
            System.out.println("collA的number值:"+collA.getNumber());  
        }  
    }  

    下面看中介者模式的实现: 

     类A类B通过直接的关联发生关系,假如我们要使用中介者模式,类A类B之间则不可以直接关联,他们之间必须要通过一个中介者来达到关联的目的

    abstract class AbstractColleague {  
        protected int number;  
      
        public int getNumber() {  
            return number;  
        }  
      
        public void setNumber(int number){  
            this.number = number;  
        }  
        //注意这里的参数不再是同事类,而是一个中介者  
        public abstract void setNumber(int number, AbstractMediator am);  
    }  
      
    class ColleagueA extends AbstractColleague{  
      
        public void setNumber(int number, AbstractMediator am) {  
            this.number = number;  
            am.AaffectB();  
        }  
    }  
      
    class ColleagueB extends AbstractColleague{  
      
        @Override  
        public void setNumber(int number, AbstractMediator am) {  
            this.number = number;  
            am.BaffectA();  
        }  
    }  
      
    abstract class AbstractMediator {  
        protected AbstractColleague A;  
        protected AbstractColleague B;  
          
        public AbstractMediator(AbstractColleague a, AbstractColleague b) {  
            A = a;  
            B = b;  
        }  
      
        public abstract void AaffectB();  
          
        public abstract void BaffectA();  
      
    }  
    class Mediator extends AbstractMediator {  
      
        public Mediator(AbstractColleague a, AbstractColleague b) {  
            super(a, b);  
        }  
      
        //处理A对B的影响  
        public void AaffectB() {  
            int number = A.getNumber();  
            B.setNumber(number*100);  
        }  
      
        //处理B对A的影响  
        public void BaffectA() {  
            int number = B.getNumber();  
            A.setNumber(number/100);  
        }  
    }  
      
    public class Client {  
        public static void main(String[] args){  
            AbstractColleague collA = new ColleagueA();  
            AbstractColleague collB = new ColleagueB();  
              
            AbstractMediator am = new Mediator(collA, collB);  
              
            System.out.println("==========通过设置A影响B==========");  
            collA.setNumber(1000, am);  
            System.out.println("collA的number值为:"+collA.getNumber());  
            System.out.println("collB的number值为A的10倍:"+collB.getNumber());  
      
            System.out.println("==========通过设置B影响A==========");  
            collB.setNumber(1000, am);  
            System.out.println("collB的number值为:"+collB.getNumber());  
            System.out.println("collA的number值为B的0.1倍:"+collA.getNumber());  
              
        }  
    }  
  • 相关阅读:
    MVC中使用AuthorizeAttribute做身份验证操作
    MVC Dynamic Authorization--示例市在Action前进行的验证,应提前到Auth过滤器
    forms
    UEditor
    Test log4net
    log4net.config
    [转]log4net使用(WinForm/WebFrom)
    如何指定模型的显示格式和模板
    64位系统中连接Access数据库文件的一个问题
    VS2008简体中文正式版序列号
  • 原文地址:https://www.cnblogs.com/liaokailin/p/3803614.html
Copyright © 2011-2022 走看看