Java设计模式(五)Facade(外观),Composite(组合),Decorator(油漆工)

结构模式(三)

Facade(外观)

为子系统中的一组接口提供一个统一接口。Facade 模式定义了一个更高层的接口,使子系统更加容易使用。


使用场景

1.为一个复杂子系统提供一个简单接口。

2.提高子系统的独立性。

3.在层次化结构中,可以使用Facade模式定义系统中每一层的入口。


参与者

Facade(外观)

         Facade是构成系统的其它参与者的“单一窗口”,为外部(使用者)提供较高给的单一接口(API)

public class Facade {
    public void doSomething() {
        Class1 c1 = new Class1 ();
        Class2 c2 = new Class2 ();
        Class3 c3 = new  Class3();

        c1.doSomething1();
        c2.doSomething2();
        c3.doSomething3();
    }
}
其它参与者
public class Class1 {
    public void doSomething1(){
    //doSomething
    }
}

public class Class2 {
    public void doSomething2(){
    //doSomething
    }
}

public class Class3 {
    public void doSomething3(){
    //doSomething
    }
}
Client使用者

public class Client {
    public static void main(String []args) {
        Facade facade = new Facade();
        facade.doSomething();
    }
} 

Façade模式的几个要点:

       1、从客户程序的角度看,Facade模式不仅简化了整个组件系统的接口,同时对于组件内部与外部客户程序来说,从某种程度上也达到了一种“解耦”的效果——内部子系统的任何变化不会影响到Facade接口的变化。

2、Facade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Facade很多时候更是一种架构设计模式。


facade实际上是个理顺系统间关系,降低系统间耦合度的一个常用的办法,也许你已经不知不觉在使用,尽管不知道它就是facade

Decorator(装饰)

动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.也就是说:动态地给对象添加一些额外的功能。它的工作原理是:创建一个始于Decorator对象(负责新功能的对象)终止于原对象的一个对象的“链”。


使用场景由用户动态决定加入的方式和时机.Decorator提供了"即插即用"的方法,在运行期间决定何时增加何种功能.

 

参与者

Component(被装饰对象基类)  

l         定义对象的接口,可以给这些对象动态增加职责;

abstract class Component{
public void method1();
public void method2();
public void method3();
}

ConcreteComponent(具体被装饰对象)

l         定义具体的对象,Decorator可以给它增加额外的职责;

class ConcreteComponent extends Component{
public void method1(){
//do something
}
public void method2(){
//do something
}
public void method3(){
//do something
}
}

Decorator(装饰者抽象类)

l         维护一个指向Component实例的引用,并且定义了与Component一致的接口;

abstract class Decorator extends Component{
 private Component component ;
 public Decorator (Component component ){
 this.component =component ;
 }

ConcreteDecorator(具体装饰者)

l         具体的装饰对象,给内部持有的具体被装饰对象增加具体的职责;

class ConcreteDecorator extends Decorator{
 public ConcreteDecorator (Component component){
  super(component);
 }
public void method1(){
//do something
}
public void method2(){
//do something
}
public void method3(){
//do something
}
}
 Decorator模式把问题分为两部分: 
  
1) 如何实现提供新功能的对象。
2) 如何为每种特殊情况组织对象。

这样能够将Decorator对象的实现与决定如何使用Decorator的对象分离开来,从而提高了内聚性,因为每个Decorator对象只用关心自己添加的功能,无需关心自己是如何被加入到对象链中。还可以任意地重排Decorator的顺序,无需改变其任何代码。


Composite(组合)

将对象组合成树形结构以表示“部分-整体”的层次结构。Composite模式使得用户对单个对象和组合对象的使用具有一致性。

组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。


使用场景

1.你想表示对象的部分-整体层次结构

2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。


参与者

Component

public interface Component{
    public void mothed1();
    public void mothed2();
    public void add(Component c);
    public void remove(Component c);
    public int getChild();
}
Leaf
public class Leaf implements Component{
     public void mothed1(){
//do something
}
    public void mothed2(){
//do something
}
    public void add(Component c){
//do something
}
    public void remove(Component c){
//do something
}
    public int getChild(){
//do something
}
}
 
  Composite 
  
public class Composite implements Component{
     public void mothed1(){
//do something
}
    public void mothed2(){
//do something
}
    public void add(Component c){
//do something
}
    public void remove(Component c){
//do something
}
    public int getChild(){
//do something
}
}
 
   
  1.使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关系自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。
2.更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码。



你可能感兴趣的:(JAVA,设计模式,decorator,设计模式,java,class,架构设计,interface)