结构模式(三)
为子系统中的一组接口提供一个统一接口。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很多时候更是一种架构设计模式。
动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.也就是说:动态地给对象添加一些额外的功能。它的工作原理是:创建一个始于Decorator对象(负责新功能的对象)终止于原对象的一个对象的“链”。
使用场景由用户动态决定加入的方式和时机.Decorator提供了"即插即用"的方法,在运行期间决定何时增加何种功能.
参与者
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模式把问题分为两部分:
这样能够将Decorator对象的实现与决定如何使用Decorator的对象分离开来,从而提高了内聚性,因为每个Decorator对象只用关心自己添加的功能,无需关心自己是如何被加入到对象链中。还可以任意地重排Decorator的顺序,无需改变其任何代码。
将对象组合成树形结构以表示“部分-整体”的层次结构。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.使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关系自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。