设计模式--装饰模式--代理模式--外观模式
一.装饰模式:动态地给一个对象增加一些额外的职责,就增加的功能来说,装饰模式相比生成子类更加灵活。
1)有一个接口
1 public interface Source { 2 public void method(); 3 }
2)有一个类实现了这个接口
1 public class OldClass implements Source{ 2 3 @Override 4 public void method() { 5 System.out.println("old class method"); 6 } 7 8 }
3)现在想给这个类动态的添加一个功能.
1 public class NewClass implements Source{ 2 private Source oldClass; 3 4 public NewClass(Source oldClass) { 5 super(); 6 this.oldClass = oldClass; 7 } 8 9 @Override 10 public void method() { 11 System.out.println("before old class "); 12 oldClass.method(); 13 System.out.println("after old class"); 14 } 15 16 }
4)使用
1 public class Main { 2 3 public static void main(String[] args) { 4 // TODO Auto-generated method stub 5 Source oldClass = new OldClass(); 6 Source newClass = new NewClass(oldClass); 7 newClass.method(); 8 } 9 10 }
最后,如果用类的继承的话,过多的继承会导致子类很多,结构混乱.
二,代理模式:为使用者提供一种代理,对这个对象访问,但使用者意识不到这个对象的存在.
1)现有一个接口
1 public interface SourceInterface { 2 public void method(); 3 }
2)实现一个Source类
1 public class Source implements SourceInterface{ 2 3 @Override 4 public void method() { 5 System.out.println("Source Method"); 6 } 7 8 }
3)实现一个Proxy类
1 public class Proxy implements SourceInterface{ 2 private SourceInterface source; 3 4 public Proxy() { 5 super(); 6 this.source = new Source(); 7 } 8 9 @Override 10 public void method() { 11 System.out.println("before"); 12 source.method(); 13 System.out.println("after"); 14 } 15 16 }
4)使用
1 public class Main { 2 3 public static void main(String[] args) { 4 Proxy p = new Proxy(); 5 p.method(); 6 } 7 8 }
对于使用者来说,,只需关心代理类即可.
三.外观模式
当类太多,需要一个统一的类来管理这些类,而使用者只需调用这个统一的类即可
比如现在有
主机类
键盘类
鼠标类
显示器类
如果使用者想使用电脑就要依次调用这4个类才行.
现在定义一个外观类--电脑类来管理这4个类
使用者只需要调用电脑类即可.