黑马程序员技术交流社区

标题: java中的设计模式的简单总结 [打印本页]

作者: 崔司龙    时间: 2015-7-2 10:57
标题: java中的设计模式的简单总结
设计模式:
        通过很多东西抽取出来的一个模型。
       
        创建型:创建对象。工厂模式,单例模式。
        结构型:对象间的关系。装饰模式。
        行为型:对象能够做什么。模板模式。
       
        GOF设计模式。(23种。)
        闫闳(国内研究设计模式比较早)
        论坛:CSDN,ITeye,J道,www.infoq.com
       
工厂模式:
        比如说,我们现在有很多动物类,猫,狗,猪...
        而这些动物有相同的行为,eat()。
        抽取一个共同的父类。动物。
       
        简单工厂模式:
                Animal
                        |--Dog
                        |--Cat
                       
                AnimalFactory
                        public static Animal createAnimal(String type){
                                if("dog".equals(type)){
                                        return new Dog();
                                }else if("cat".equals(type)){
                                        return new Cat();
                                }else {
                                        return null;
                                }
                        }
                       
        工厂方法模式:
                Animal
                        |--Dog
                        |--Cat
                        |--Pig
                       
                AnimalFactory
                        |--DogFactory
                        |--CatFactory
                        |--PigFactory
                       

单例模式:
        就是指类在内存中只能有一个对象。
        举例:windows的打印服务,网站计数器
        应用:线程池,数据库连接池
       
        面试题:请写出一个单例设计模式。
       
        分析:
                类在内存中只能有一个对象。
               
        A:外界不能够随意创建对象。
                把构造方法私有
        B:类本身要创建一个对象。
        C:通过公共的方式提供给别人。               
               
        单例模式分类:
                饿汉式:类加载就创建对象(开发用)
                懒汉式:什么时候用,就什么时候创建。(面试用)
               
                为什么?
                        A:延迟加载。
                        B:线程安全问题。怎么解决呢?
                       
装饰模式:对类原有的功能进行了修饰或者扩充。
        我们都有手机,手机具备打电话的功能。
        按照正常做法,我们应该把手机类给设计出来,并给出一个打电话功能。Phone.java
        随着发展,人的需求也是在变化的,假设我现在需要在打电话前听到彩铃,而这种需求是部分人需要的,那么,现在我们该怎么办呢?
        回想我们曾经学过继承,通过继承就可以具备父亲的打电话功能,我还可以在新的手机上添加彩铃功能。ColorPhone.java
        继续发展,人的需求又发生改变了,我想在打完电话后,可以播放广告。GuangGaoPhone.java
        需求继续改变,我想要先有彩铃,接着打电话,最后放广告。
                A:继承ColorPhone
                B:继承Phone,然后自己实现彩铃,父亲的打电话,自己实现广告
        需求还是可以继续发生改变的,使用继承可以解决问题,但是,将来一旦某个父亲发生了改变,依赖这个父亲的子类都会发生改变。
        所以,这种解决方案可以,但是不好。
       
        Phone
                |--ColorPhone
                        |--ColorGuangGaoPhone
                                |--...
                |--GuangGaoPhone
                        |--...
               
        既然不好,那么, 在开发的过程中,就会有相应的东西来替代它。
        这种东西就叫:设计模式。
        而我们讲解的这种模式:装饰设计模式。
        A:被装饰的抽象事物 Phone
        B:具体的事物 PhoneImpl
                实现Phone接口,具体实现类
        C:装饰类 PhoneDecorate
                实现Phone接口,调用实现。
               
                private Phone phone;

                public PhoneDecorate(Phone phone) {
                        this.phone = phone;
                }
       
                @Override
                public void call() {
                        this.phone.call(); // 具体的手机打电话功能
                }
               
       
        要有彩铃:
                具有彩铃功能的装饰类
        要有广告:
                具有广告功能的装饰类
        要有先彩铃,接着电话,最后广告功能。
                ...
               
               
        Phone(接口)
                |--PhoneImpl(具体实现类)
                |--PhoneDecorate(抽象类)
                        |--ColorPhoneDecorate(具体装饰类)
                        |--GuangGaoPhoneDecorate(具体装饰类)
                       
                       
模板模式:
        我需要打印一篇文章,这篇文章:
                头,中间,尾组成。
               
        Print
                print(){
                        printHead();
                        printBody();
                        printBottom();
                }
                printHead(){}
                printBody(){}
                printBottom(){}
               
        这样做的话,我们就得把打印操作给固定了,固定后如果有新的变化,发现不好。
        怎么办呢?我们就采用一种设计模式解决:模板模式。
       
        模板类:(抽象类)
               
        打印模板类:
                打印方法:具体的。
               
                三个抽象方法。
               
        具体实现类1:
        具体实现类2:

作者: 雏鹰起飞    时间: 2015-7-2 12:22
谢谢分享
作者: fmi110    时间: 2015-7-2 12:52
学习一下 谢谢分享




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2