zoukankan      html  css  js  c++  java
  • 滴水穿石-12 设计模式

    设计模式(Design pattern):优秀经验的总结

    1:设计模式分类:

    1.1 创建型模式;

      对象的创建,主要包括:简单工厂模式;工厂方法模式;抽象工厂模式;建造者模式;原型模式;单例模式

      1.1.1 简单工厂模式

      又叫静态工厂方法模式,定义一个专门创建对象的工厂类.

      优点:明确了类的职责,客户端不需要在负责对象的创建

      缺点:静态工厂类负责所有对象的创建,如果有新的对象增加,需要不断修改工厂类,不利于维护.  

    package d12;
    
    public abstract class Animal {
        public abstract void eat();
    }
    Animal
    package d12;
    
    public class Dog extends Animal {
    
        @Override
        public void eat() {
            System.out.println("狗吃肉!");
        }
    
    }
    Dog
    package d12;
    
    public class Cat extends Animal {
    
        @Override
        public void eat() {
            System.out.println("猫吃鱼!");
        }
    
    }
    Cat
    package d12;
    
    public class AnimalFactory {
        public static Animal createAnimal(String animalType) {
            if ("dog" == animalType) {
                return new Dog();
            } else if ("cat" == animalType) {
                return new Cat();
            }
            //缺点:如果增加其他动物的话,需要不断修改该工具类
            return null;
        }
    }
    AnimalFactory
    package d12;
    
    public class SimpleFactoryTest {
    
        public static void main(String[] args) {
            // 1.0 普通调用
            Dog d = new Dog();
            d.eat();    
            /*输出结果
             *狗吃肉! *?
             */
            //2.0 创建简单工厂类,用于对象的创建
            Animal c = AnimalFactory.createAnimal("cat");
            if (d!=null) {
                c.eat();
            }
            /*输出结果
             *猫吃鱼! *?
             */
        }
    
    }
    SimpleFactoryTest

      1.1.2 工厂方法模式

      抽象工厂类负责定义创建对象的接口,具体对象的创建工作有继承抽象工厂类的具体类实现

      优点:与 简单工厂类相比,如果有新的对象增加,只需要增加一个具体的类和具体的工厂类即可,扩展性强

      缺点:增加代码量

    package d12;
    
    public abstract class Animal {
        public abstract void eat();
    }
    Animal
    package d12;
    
    public class Dog extends Animal {
    
        @Override
        public void eat() {
            System.out.println("狗吃肉!");
        }
    
    }
    Dog
    package d12;
    
    public class Cat extends Animal {
    
        @Override
        public void eat() {
            System.out.println("猫吃鱼!");
        }
    
    }
    Cat
    package d12;
    
    public interface Factory {
        public abstract Animal createAnimal();
    }
    Factory
    package d12;
    
    public class DogFactory implements Factory {
    
        @Override
        public Animal createAnimal() {
             return new Dog();
        }
    
    }
    DogFactory
    package d12;
    
    public interface FactoryMethodTest {
    
        public static void main(String[] args) {
            Factory f = new DogFactory();
            Animal a = f.createAnimal();
            a.eat();
        }
    }
    FactoryMethodTest

       1.1.3 单例模式

      确保类在内存中只有一个对象,该类必须自动实现,并且对外提供

      优点:在内存中只有一个对象

      缺点:扩展性差

    package d12;
    //01 构造方法私有化
    //02 自己创建对象
    //03 对外界提供
    public class Student {
        //单利模式--饿汉式 
        private  Student() {}
        //02 自己创建 ,为了让外界直接访问加static,为了让外界不能修改添加private
        private static Student s = new Student();
        //03  对外界提供
        public static Student getStudent() {
            return s;                
        }
    }
    饿汉式
    package d12;
    //01 构造方法私有化
    //02 自己创建对象
    //03 对外界提供
    public class Student {
        //单利模式--懒汉式 
        private  Student() {}
        //02 自己创建 ,为了让外界直接访问加static,为了让外界不能修改添加private
         private static Student s = null;
        //03  对外界提供
        public static Student getStudent() {
            if (s==null) {
                s =  new Student();
            }
            return s;                
        }
    }
    懒汉式

    懒汉式存在线程安全问题

      解决方法,添加同步

    1.2 结构型模式;

      对象的组成结构,主要包括:外观模式;适配器模式;代理模式;装饰模式;桥接模式;组合模式;享元模式

      1.2.1 适配器模式

           两个不兼容的接口之间的桥梁.

      优点:灵活性好

      缺点:过多地使用适配器,会让系统非常零乱,不易整体进行把握

      场景:接口(方法比较多) == 适配器(实现接口,仅仅是空实现)==实现类(实现其中的某个或部分方法)  

    package d12;
    
    public interface UserDao {
        void add();
        void delete();
        void update();
        void select();
        
    }
    UserDao
    package d12;
    
    public abstract class UserAdapter implements UserDao {
    
        @Override
        public void add() {
             
        }
    
        @Override
        public void delete() {
             
        }
    
        @Override
        public void update() {
        }
    
        @Override
        public void select() {
             
        }
    
    }
    UserAdapter
    package d12;
    
    public class UserDaoImpl extends UserAdapter {
        @Override
        public void add() {
            // TODO Auto-generated method stub
            System.out.println("添加方法!");
        }
    }
    UserDaoImpl
    package d12;
    
    public class UserDaoTest {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            UserDao ud = new UserDaoImpl();
            ud.add();
        }
    
    }
    UserDaoTest

       1.2.2 装饰模式

    package d12;
    
    public abstract class Phone {
        //手机类 的子类中都有Call方法
        public abstract void call();
    }
    Phone
    package d12;
    
    public class Huawei extends Phone {
    
        @Override
        public void call() {
            System.out.println("华为手机:可以打电话");
        }
    
    }
    Huawei
    package d12;
    
    public abstract class PhoneDecorate extends Phone {
    
        private Phone p;
        public PhoneDecorate(Phone p) {
            this.p = p;
        }
        @Override
        public void call() {
            p.call();
        }
    
    }
    PhoneDecorate
    package d12;
    
    public class RingDecorate extends PhoneDecorate {
    
        public RingDecorate(Phone p) {
            super(p);
            // TODO Auto-generated constructor stub
        }
    
        @Override
        public void call() {
            System.out.println("彩铃装饰");
            super.call();
        }
    
    }
    RingDecorate
    package d12;
    
    public class MusicDecorate extends PhoneDecorate {
    
        public MusicDecorate(Phone p) {
            super(p);        
        }
    
        @Override
        public void call() {        
            super.call();
            System.out.println("音乐装饰");
        }
    
    }
    MusicDecorate
    package d12;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    
    public class PhoneTest {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Huawei hw = new Huawei();
            PhoneDecorate rd = new RingDecorate(hw);
            rd.call();
            /*输出结果
    彩铃装饰
    华为手机:可以打电话 */
            //同理 添加听音乐装饰
            PhoneDecorate md = new MusicDecorate(hw);
            md.call();
            /*输出结果
    华为手机:可以打电话
    音乐装饰 */
            
            //注意 同时装饰两个 彩铃+音乐
            //new MusicDecorate(hw) 继承自PhoneDecorate 继承自Phone
            PhoneDecorate mwd =  new RingDecorate(new MusicDecorate(hw));
            mwd.call();
            /*输出结果        
    彩铃装饰
    华为手机:可以打电话
    音乐装饰 */
            
            //这种用法
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            
        }
    
    }
    PhoneTest

    1.3 行为型模式

      对象的行为,主要包括:模板设计模式;观察者模式;状态模式;职责链模式;命令模式;访问者模式;策略模式;备忘录模式;迭代器模式;解释器模式

      1.3.1 模板设计模式

      定义一个算法的骨架,而将具体的算法延迟到子类中来实现

      优点:灵活多改变

      缺点:如果算法骨架有修改的话,需要修改抽象类  

    package d12;
    
    public abstract class GetTime {
        public long getTime() {
            long startTime = System.currentTimeMillis();
            code();
            long endTime = System.currentTimeMillis();
            return endTime-startTime;
        }
    
        public abstract void code();
    }
    GetTime
    package d12;
    
    import java.util.Iterator;
    
    public class GetTimeDemo extends GetTime {
    
        @Override
        public void code() {
            for (int i = 0; i < 100000; i++) {
                System.out.println(i);
            }        
        }
    }
    GetTimeDemo
    package d12;
    
    public class GetTimeTest {
    
        public static void main(String[] args) {
            GetTime d =new GetTimeDemo();
            System.out.println("用时: "+d.getTime()+"毫秒"); 
        }
    
    }
    GetTimeTest
  • 相关阅读:
    c#基于业务对象的筛选
    SQLServer索引调优实践
    C#中抽象类和接口的区别
    c#基础(2) 理解委托和事件
    建议学习jQuery的步骤!
    SQL SERVER存储过程调用存储过程并接收输出参数或返回值的方法
    ASP.NET基于JQUERY的高性能的TreeView
    GetManifestResourceStream得到的Stream是null的解决
    Using GDI+ on Windows Mobile 初体验
    提供一个Windows mobile Native UI 程序,循序渐进开发,并附有代码!
  • 原文地址:https://www.cnblogs.com/YK2012/p/8726808.html
Copyright © 2011-2022 走看看