zoukankan      html  css  js  c++  java
  • Java设计模式

    Java设计模式 单例模式 装饰者模式

    作者 : Stanley 罗昊

    转载请注明出处和署名,谢谢!

    静态代理模式:https://www.cnblogs.com/StanleyBlogs/p/10761604.html

    什么是设计模式

    设计模式其实就是是写了很多代码的人总结出来的经验!

    设计模式是关于一些问题的最佳解决方案;

    也就是说,每一个典型的问题,关于一个典型的问题,他都会总结出来一个最佳的解决方案;

    就比方说医生问诊:

    你挂不同的科室,也就是不同的医生,每个医生都有自己擅长并拿手的治疗方案,关于某一个疾病都有自己独特的解决方案;

    设计模式其实也一样,就是通过大量的代码总结出来的一些问题的最佳解决办法;

    Java的设计模式一共有23种设计模式;

    在这23种设计模式中,你仅掌握3~4种设计模式即可,并且要求能够手写出来

    23种设计模式并分为三大类:

    1.创建型模式【五种】

    工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式

    2.结构型模式【七种】

    适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式

    3.行为型模式【十一种】

    策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式

    设计模式 -- 六大设计原则

    总原则:开闭原则(Open Close Princciple)

    对修改关闭,对扩展开放,所有的设计模式都必须遵循这个原则!

    也就是说,所有的设计模式,你可以扩展它的功能,但是不可以修改它原始的功能;

    六大小原则:

    1.单一职责原则

    不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责,如若不然,就应该把类拆分;

    2.里氏替换原则

    里氏替换原则中,子类对父类的方法尽量不要重写和重载,因为父类代表了定义好的结构,通过这个规范的接口与外界交互,子类不应该随便破坏它;

    3.依赖倒转原则

    这个原则的意思四,每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分。使用多张个隔离的接口,比使用单个接口(多个几口方法结合到一个的接口)更好;

    4.迪米特法则(最少知道原则)

    就是说,一个类对自己的依赖的类知道的越少越好。也就是说无论被依赖的类多么复杂,都应该将逻辑封装在方法的内部,通过public方法提供给外部,这样当被依赖的类变化时,才能量最小的影响该类;

    6.复合重用原则

    尽量首先使用合成/聚合的方式,而不是使用继承的方式;

    单例设计模式

    单例设计模式是最简单的设计模式

    目的:创建全局唯一的实例对象;

    1.饿汉模式

    在类加载的时候,就创建一个对象,因为就比较饿嘛,上来就创建对象;

    2.懒汉模式

    需要的时候才创建,因为比较懒,你不拿鞭子抽它,他就不动;

    手写单例设计模式

    下面呢,我将创建一个类,这个类,我就把它搞成一个单例设计模式;

    单例设计模式有三点,第一点:私有的构造器;

                                       第二点:私有的静态属性,并且变量类型与类同名;

                                       第三点:共有的创建实例对象的方法(那我这个方法返回的肯定是一个SingleDemo01类型);

    标准的线程安全的单例模式:

    public class SingleDemo01{

    //1.私有的构造器
    
    private SingleDemo01(){}
    
    //2.私有的静态属性
    
    private static SingleDemo01 single;
    
    //3.公有的创建实例对象的方法
    
    public SingleDemo01getInstance(){
    
    if(single == null)//2个线程
    
    synchronized(SingleDemo01.class){
    
    if(single == null){
    
    single = new SingleDemo01();
    
    }
    
    }
    return single;
    }
    }

    装饰者模式

    当你需要对某一个类的某一个功能进行增强的时候,就要用到装饰者模式;

    下面就举一些例子来完成对装饰者模式的认知:

    我现在想对list集合中的add方法进行增强,在添加元素时打印一句“开始添加元素”,添加完成后再打印一句“元素添加完成”;

    我们看到以上需求,我们本次采用装饰者模式去实现,去实现之前呢需要注意两点:

    1.将要装饰的或包装的类,作为增强类的属性

    2.需要实现增强功能

    具体实现过程:

    首先,我们先定义一个类,叫MyList;

    我现在要加强List的add方法,那么首先我就需要让list作为我的成员属性;

    定义好一个list泛型类型的属性后,我们需要对它进行赋值,所以我们就再给它提供一个构造函数;

    之后呢,我们在类中写一个带参的add方法,那我现在这个add方法是不是就是要对原始的add方法进行增强了;

    编码:

    public class MyList{
    
    private List<String>list;
    
    public MyList(List<String>list){
    
    super();
    
    this.list = list;
    
    }
    
    public void add (String e){
    
    //添加之前输出一句
    
    System.out.println("start。。。。。。。。。。");
    
    //添加
    
    list.add(e);
    
    //添加之后再输出一句
    
    System.out.println("end。。。。。。。。。。");
    
    }

    这个就是装饰者模式,某类中的某一个方法进行增强

    //写一个main方法进行测试
    
    public static void main (String[] args){
    
    //先建立一个list集合
    
    List<String>list = new List<String>();
    
    //list集合建完之后,我是不是就再建一个Mylist直接把值穿进去是不是就可以了
    
    MyList my = newMyList(list);
    
    my.add("ss");
    
    }
    
    }

    打印输出结果:

     我们看到执行结果,是不是已经按照要求增强了;

    这个时候我们还可以继续改进;

    改造成只能添加含有start的元素;

    我们仅需加一个if判断即可:

    public class MyList{
    
    private List<String>list;
    
    public MyList(List<String>list){
    
    super();
    
    this.list = list;
    
    }
    
    public void add (String e){
    
    //添加之前输出一句
    
    System.out.println("start。。。。。。。。。。");
    
    //添加
    
    if(e.contains("start")){//这里我们加了一个判断,表示判断添加进来的元素是否包含start,如果不包含就不进入该方法,也就意味着元素没添加进去
    
    list.add(e);
    
    }
    
    //添加
    
    list.add(e);
    
    //添加之后再输出一句
    
    System.out.println("end。。。。。。。。。。");
    
    }
  • 相关阅读:
    Can't use Subversion command line client: svn
    SpringMVC配置easyui-datagrid
    找不到提交和更新按钮,subversion不见了,无法更新和上传代码
    静态资源[org.springframework.web.servlet.PageNotFound]
    Field 'id' doesn't have a default value
    MySql 插入数据中文乱码
    Junit 测试 Spring
    mybatis动态SQL
    Mybatis 3.3.0 Log4j配置
    MappingJacksonHttpMessageConverter过期
  • 原文地址:https://www.cnblogs.com/StanleyBlogs/p/10806876.html
Copyright © 2011-2022 走看看