zoukankan      html  css  js  c++  java
  • 设计模式: 单列设计模式 、模块方法设计模式、装饰设计模式、工厂设计模式、适配器设计模式

    面向对象的思想:

    单一
    开闭
    里氏
    依赖注入
    接口
    迪米特

    设计模式:就是一种设计的经验的总结,有 创建、 行为、 结构  三种。

    一、单列设计模式

        1、设计模式:解决某一类问题的最行之有效的方法。
        2、Java中有23中基本设计模式。
        3、单列设计模式:一个类在内存中只有一个对象。


      为了达到单列设计模式,如下考虑:
        1、 为了避免其他程序过多建立该类对象,所以要先禁止其他程序建立该类对象。
        2、 但是为了有一个该类对象可用,所以只有通过自己建立一个本类对象。
        3、 为了让其他程序使用该对象,所以要对外提一些访问方式。

      有了上述思考,于是有了如下步骤:
        1、 将其构造私有化 (使用 private 修饰构造函数)
        2、 在类中 new 一个本类对象。
        3、 提供一个 static 方法能调用到上步建立的对象。

      代码示例如下:
      class Single //饿汉式 (饿汉式在开发时更常用)
      {
        private Single(){}
        private static Single s = new Single();
        public static Single getInstans()
        {
          return s;
        }
      }

      class Single //懒汉式
      {

        private static Single s;
        private Single(){}

        public static Single getInstance()
        {
          if(s==null)
            s = new Single();
          return s;
        }
      }

      class Test
      {
        public static void main(String []args)
        {
          Single ss = Single.getInstans();
        }
      }


    二、模板方法设计模式

        在定义功能时,部分功能时确定的, 部分功能时不确定的, 而确定功能在使用不确定的功能,
        我们就可以将不缺定的功能暴露出去,由子类去完成。
        而确定部分就使用 final封装起来。

    三、装饰设计模式:

      描述:

          当想要对已有对象的功能进行加强的时候,可以定义类: 该类传入已有对象为参数,并基于已有对象的功能,提供更加强大的功能。
        那么,自定义的该类就是装饰类。

          装饰类通常会在构造函数中接受被装饰的对象,并基于被装饰的对象的功能提供更强大的功能。

      和继承的区别:

          继承体系 Futher
            |---Son1 extends Futher
              |--- SuperSon1 extends Son1
            |---Son2 extends Futher
              |--- SuperSon2 extends Son2
            |---Son3 extends Futher
              |--- SuperSon3 extends Son3

          装饰体系 Futher
            |---Son1
            |---Son2
            |---Son3
            |---class Super extends Futher
              {
                private Futher f;
                public Super(Futher f)
                {
                  this.f= f;
                }
              }


       相比于继承,装饰模式比继承有更多的灵活性,避免了继承模式的臃肿。减低了类与类之间的关系。

       装饰因为是增强已有对象,具备的功能和已有的是相同的,只是提供了更强大的功能。
       所以装饰类和被装饰类通常都属于一个体系。

    四、简单工厂模式

        


      又叫静态工厂模式,其定义个静态工厂类,负责创建一些类的实例(一类对象一个工厂)。
        优点:
          客户端不需要负责对对象的创建,从而明确了各个类的职责。
        缺点:
          这个静态工厂负责对所有的类的创建,如果有新的对象的增加,或者某些对象的创建方式不同,就需要不断的修改工厂,不利于后期维护。

    五、工厂方法模式:
      工厂方法模式中抽象工厂类负责定义创建对象的接口,具体对象的创建工作由继承抽象工厂的继承类实现(每种对象一个工厂)。

      优点:
        客户端不需要再负责对象的创建从而明确了各个类的职责,如果有新的对象增加,只需要增加一个具体的类和一个具体的工厂类即可。
        不影响已有代码,后期维护容易,增强了系统的扩展性。
      缺点:
        需要额外的代码编写,增加了工作量。




    六、适配器模式:


        对于一个有多个抽象方法的接口,有一个具体的类要实现此接口中的某一项功能,如果直接实现了该接口就会被要求实现其所有的抽象的功能。
      这显然不太合适,所以:
        我们写了一个实现该接口的Adapter类,该类空值的实现了接口中的所有功能, 我们只需要继承该Adapter类就可以让我们只复写其中的我们
      所需要的功能了。 这个Adapter类就叫适配器。

    七、代理模式

     

      1.1、代理模式
        什么是代理模式及其作用
          Proxy Pattern(即:代理模式),23种常用的面向对象软件的设计模式之一
          代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,
                  一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客
                  户端和目标对象之间起到中介的作用。
        优点:
          (1).职责清晰
            真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,
            通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。

          (2).代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的作用。

          (3).高扩展性
        结构
          一个是真正的你要访问的对象(目标类),另一个是代理对象,真正对象与代理
          对象实现同一个接口,先访问代理类再访问真正要访问的对象。


      1.2、动态代理
        动态代理它可以直接给某一个目标对象生成一个代理对象,而不需要代理类存在。
        动态代理与代理模式原理是一样的,只是它没有具体的代理类,直接通过反射生成了一个代理对象。
        动态代理生成技术:
          1.  jdk提供一个Proxy类可以直接给实现接口类的对象直接生成代理对象。
          2.  cglib (spring)

        Java.lang.reflect.Proxy类可以直接生成一个代理对象

        Proxy.newProxyInstance():产生代理类的实例。仅能代理实现至少一个接口的类
        ClassLoader:类加载器。固定写法,和被代理类使用相同的类加载器即可。
        Class[] interface:代理类要实现的接口。固定写法,和被代理类使用相同的接口即可。
        InvocationHandler:策略(方案)设计模式的应用。如何代理?

        InvocationHandler中的invoke方法:调用代理类的任何方法,此方法都会执行
          Object proxy:代理对象本身的引用。一般用不着。
          Method method:当前调用的方法。
          Object[] args:当前方法用到的参数

  • 相关阅读:
    flask---第一篇
    python 奇技淫巧
    Date
    StringBuffer和StringBuilder
    Object
    String 类中的几个练习--获取指定字符串中,大写字母、小写字母、数字的个数||获取一个字符串中,另一个字符串出现的次数
    String 中常用的几种方法
    final
    String类中"=="、equals和普通类中"=="、equals的比较
    构造方法
  • 原文地址:https://www.cnblogs.com/soficircle/p/6613697.html
Copyright © 2011-2022 走看看