3、装饰者模式_策略模式_观察者模式

一、装饰模式:
    就是给一个对象增长一些新的功能,而且是动态的,要求装饰对象和被装对象实现同一个接口。装饰对象持有被装饰对象的实例。
装饰者模式中的要求:
 1) 装饰者和被装饰则应该实现同一个类;
 2) 装饰者含有被装饰者的引用
 3) 一个类含有另外一个类明显的关联关系
 4) 装饰者和被装饰者里面的方法必定要同样,为何要这样作?是为了保障这两个类具备相同的方法
装饰者模式比继承更能下降代码的耦合度,有利于项目的扩展;java

public class DecoratorTest {
    public static void main(String[] args) {
        FileReader fReader = new FileReader();//建立被装饰者
        BufferedReader brReader = new BufferedReader(fReader);//建立装饰者
        brReader.close();//经过执行装饰者中的方法间接去执行被装饰者中的方法。
    }
}

abstract class Reader {
    public abstract void close();
}

class FileReader extends Reader {// FileReader 是被装饰者
    @Override
    public void close() {
        System.out.println("FileReader类中的重写的close方法执行");
    }
}

class BufferedReader extends Reader {// BufferedReader是装饰者
    FileReader fileReader;// 一个类含有另外一个类明显的关联关系

    public BufferedReader(FileReader fileReader) {// 装饰者模式中要求,装饰者含有被装饰者的引用
        this.fileReader = fileReader;
    }

    @Override
    public void close() {
        System.out.println("扩展代码1");// 什么是扩展就是在源代码执行的基础之上,加一些代码,这就是扩展
        fileReader.close();
        System.out.println("扩展代码2");
    }
}
View Code

 运行结果:算法

扩展代码1
FileReader类中的重写的close方法执行
扩展代码2
View Code

二、策略模式:
    定义了一系列算法,并将每一个算法封装起来,使他们能够相互替换,且算法的变化不会影响到使用算法的客户。须要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(无关紧要,属于辅助类),提供辅助函数。
    策略模式的决定权在用户,系统自己提供不一样算法的实现,新增或者删除算法,对各类算法作封装。所以,策略模式多用在算法决策系统中,外部用户只须要决定用哪一个算法便可。数组

public class StrategyTest {
    public static void main(String[] args) {
        String exp = "2+8";
        ICalculator cal = new Plus();
        int result = cal.calculate(exp);
        System.out.println(result);
    }
}
//定义算法接口:为一系列实现类提供统一的方法,多个实现类实现该接口
interface ICalculator {
    public int calculate(String exp);
}
//定义一个抽象类:提供辅助函数,(无关紧要,属于辅助类)。
class AbstractCalculator {
    public int[] split(String exp, String opt) {
        String array[] = exp.split(opt);
        int arrayInt[] = new int[2];
        arrayInt[0] = Integer.parseInt(array[0]);
        arrayInt[1] = Integer.parseInt(array[1]);
        return arrayInt;
    }
}

class Minus extends AbstractCalculator implements ICalculator {

    public int calculate(String exp) {
        int arrayInt[] = split(exp, "-");
        return arrayInt[0] - arrayInt[1];
    }
}

class Plus extends AbstractCalculator implements ICalculator {

    public int calculate(String exp) {
        int arrayInt[] = split(exp, "\\+");
        return arrayInt[0] + arrayInt[1];
    }
}
View Code

运行结果:10
三、观察者模式:
    相似于邮件订阅和 RSS 订阅,当咱们浏览一些博客或 wiki 时,常常会看到 RSS 图标,就这的意思是,当你订阅了该文章,若是后续有更新,会及时通知你。其实,简单来说就一句话:当一个对象变化时,其它依赖该对象的对象都会收到通知,而且随着变化!对象之间是一种一对多的关系。
下面示列含义:MySubject 本身发生变化以后,会通知关注MySubject的对象Observer一、Observer2
ide

import java.util.Enumeration;
import java.util.Vector;

public class ObserverTest {
    /**
     * @param args
     */
    public static void main(String[] args) {
        Subject sub = new MySubject();
        sub.add(new Observer1());
        sub.add(new Observer2());
        sub.operation();
        int x = 0;
        int y = 10;
        do {
            y--;
            ++x;
        } while (x < 6);
        System.out.println(x + ',' + y);
    }

}

interface Observer {
    public void update();
}

class Observer1 implements Observer {
    public void update() {
        System.out.println("observer1 has received!");
    }
}

class Observer2 implements Observer {
    public void update() {
        System.out.println("observer2 has received!");
    }
}

interface Subject {
    /* 增长观察者 */
    public void add(Observer observer);

    /* 删除观察者 */
    public void del(Observer observer);

    /* 通知全部的观察者 */
    public void notifyObservers();

    /* 自身的操做 */
    public void operation();
}

abstract class AbstractSubject implements Subject {
    //Vector 类能够实现可增加的对象数组
    private Vector<Observer> vector = new Vector<Observer>();

    public void add(Observer observer) {
        vector.add(observer);
    }

    public void del(Observer observer) {
        vector.remove(observer);
    }

    public void notifyObservers() {
        Enumeration<Observer> enumo = vector.elements();// elements()
        // 返回此向量的组件的枚举。
        while (enumo.hasMoreElements()) {
            enumo.nextElement().update();
        }
    }
}

class MySubject extends AbstractSubject {
    public void operation() {
        System.out.println("update self!");
        notifyObservers();
    }
}
View Code

运行结果:函数

update self!
observer1 has received!
observer2 has received!
54
View Code
相关文章
相关标签/搜索