外观模式(设计模式_12)

由来:外观模式的由来,举一个例子:研发人员做了一个系统给客户用户使用,客户用户不需要知道那么多的具体细节,客户用户访问这些,具体的细节,耦合度也比较高,所以就定义了 一个外观对象,外观对象去处理这些具体的细节,客户用户只需要去访问外观对象,的行为即可


外观模式在设计中非常的常见,这种模式可以减低耦合度,区域划分的比较灵活,不需要增加客户用户的复杂度;

我们来看几个案例来说明分析:


常规的写法:

/**
 * 创建一个煮菜的类
 * @author Liudeli
 */
public class Cook {

    /**
     * 此方法是煮菜的行为
     */
    public void doMethod() {
        System.out.println("煮好了一条鱼,煮熟了一只鸡,烤完了一头猪....");
    }

}

/**
 * 定义一个买菜类
 * @author Liudeli
 */
public class Food {

    /**
     * 此方法是买菜的行为
     */
    public void doMethod() {
        System.out.println("买了一条鱼,买了一只鸡,买了一头猪....");
    }

}

/**
 * 创建一个洗菜的类
 * @author Liudeli
 */
public class Wash {

    /**
     * 此方法是洗菜的行为
     */
    public void doMethod() {
        System.out.println("洗好了一条鱼,洗干净一只鸡,洗完了一头猪....");
    }

}

/**
 * 测试程序
 * @author Liudeli
 *
 */
public class Main {

    public static void main(String[] args) {

        Food food = new Food();
        food.doMethod();

        Wash wash = new Wash();
        wash.doMethod();

        Cook cook = new Cook();
        cook.doMethod();

    }

}

执行结果:
这里写图片描述


修改成外观模式:

/**
 * 定义一个买菜类
 * @author Liudeli
 */
public class Food {

    /**
     * 此方法是买菜的行为
     */
    public void doMethod() {
        System.out.println("买了一条鱼,买了一只鸡,买了一头猪....");
    }

}

/**
 * 创建一个洗菜的类
 * @author Liudeli
 */
public class Wash {

    /**
     * 此方法是洗菜的行为
     */
    public void doMethod() {
        System.out.println("洗好了一条鱼,洗干净一只鸡,洗完了一头猪....");
    }

}

/**
 * 创建一个煮菜的类
 * @author Liudeli
 */
public class Cook {

    /**
     * 此方法是煮菜的行为
     */
    public void doMethod() {
        System.out.println("煮好了一条鱼,煮熟了一只鸡,烤完了一头猪....");
    }

}

/**
 * 定义一个外观类
 * @author Liudeli
 */
public class Appearance {

    /**
     * 外观类的执行方法,用于执行具体细节操作,给客户呈现的就是此方法
     */
    public void doMethod() {

        Food food = new Food();
        food.doMethod();

        Wash wash = new Wash();
        wash.doMethod();

        Cook cook = new Cook();
        cook.doMethod();

    }

}

/**
 * 用户客户调用外观类即可,其他具体细节不需要关系
 * @author Liudeli
 *
 */
public class Main {

    public static void main(String[] args) {

        // 创建外观对象,执行方法

        Appearance appearance = new Appearance();
        appearance.doMethod();

    }

}

运行结果:
这里写图片描述


/**
 * 定义一个ClassA类
 * @author Liudeli
 */
public class ClassA {

    /**
     * 此方法就是简单的打印一句话
     */
    public void methodA() {
        System.out.println("ClassA methodA()...");
    }

}

/**
 * 定义一个ClassB类
 * @author Liudeli
 */
public class ClassB {

    /**
     * 此方法就是简单的打印一句话
     */
    public void methodB() {
        System.out.println("ClassB methodB()...");
    }

}

/**
 * 定义一个ClassC类
 * @author Liudeli
 */
public class ClassC {

    /**
     * 此方法就是简单的打印一句话
     */
    public void methodC() {
        System.out.println("ClassC methodC()...");
    }

}

/**
 * 定义一个外观类,将ClassA,ClassB,ClassC,统一调用
 * @author Liudeli
 */
public class Appearance {

    /**
     *  此方法用于调用ClassA,ClassB,ClassC类里面的方法
     */
    public void method() {

        ClassA classA = new ClassA();
        classA.methodA();

        ClassB classB = new ClassB();
        classB.methodB();

        ClassC classC = new ClassC();
        classC.methodC();
    }

}

/**
 * 模拟客户端测试程序
 * @author Liudeli
 */
public class Main {

    public static void main(String[] args) {
        // 其他的具体细节,客户不需要知道,因为都交给了外观类
        // 调用外观类即可
        Appearance appearance = new Appearance();
        appearance.method();
    }

}

运行结果:
这里写图片描述


我们会发现外观模式代理模式是多么的相似,其实认真去分析确实很相似,只是他们的应用场景不一样


谢谢大家的观看,更多精彩技术博客,会不断的更新,请大家访问,
刘德利CSDN博客, http://blog.csdn.net/u011967006

原文地址:https://www.cnblogs.com/android-deli/p/10322213.html