• 外观模式(设计模式_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

  • 相关阅读:
    Error creating bean with name 'entityManagerFactory' defined in class path resource
    com.sun.org.apache.regexp.internal不存在
    [Kubernetes] Best Practices/Design Patterns for Kubernetes in Production
    [Tools] Kill the process running on port 8080
    [AWS] Lab: Docker and CodeCommit Part 1
    [AWS] Lab: Docker with CodeCommit & CodeBuild Part2
    [AWS] Lab: Launching an EKS Cluster
    [AWS] Lab: Configure and Work with CodeCommit from the CLI
    [DevOps] Environment Variables with Travis
    [DevOps] CI/CD Benefits
  • 原文地址:https://www.cnblogs.com/android-deli/p/10322213.html
Copyright © 2020-2023  润新知