一、装饰模式:
就是给一个对象增长一些新的功能,而且是动态的,要求装饰对象和被装对象实现同一个接口。装饰对象持有被装饰对象的实例。
装饰者模式中的要求:
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"); } }
运行结果:算法
扩展代码1
FileReader类中的重写的close方法执行
扩展代码2
二、策略模式:
定义了一系列算法,并将每一个算法封装起来,使他们能够相互替换,且算法的变化不会影响到使用算法的客户。须要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(无关紧要,属于辅助类),提供辅助函数。
策略模式的决定权在用户,系统自己提供不一样算法的实现,新增或者删除算法,对各类算法作封装。所以,策略模式多用在算法决策系统中,外部用户只须要决定用哪一个算法便可。数组
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]; } }
运行结果: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(); } }
运行结果:函数
update self! observer1 has received! observer2 has received! 54