设计模式的分类
创建型
单例模式、简单工厂模式、抽象工厂模式、创建者模式、原型模式
结构型
代理模式、适配器模式、装饰者模式、桥接模式、门面模式、享元模式、组合模式
行为型
观察者模式、状态模式、策略模式、模版方法模式、责任链模式、迭代器模式、访问者模式、备忘录模式、命令模式、解释器模式、中介模式
 通常设计模式可以通过组合使用,来提供满足设计原则的实现  
常用设计模式举例
单例模式
通常 java 中的单例模式有 5 种实现方式, 而不是老师课件中的 2 种  
五种方式分别是:饿汉式、懒汉式、双重检查(懒汉式)、静态内部类和枚举
通常更推荐饿汉式、静态内部类和枚举这些无锁的实现
饿汉式
 /** * 饿汉式 */public class Singleton_01 {    private Singleton_01(){}    private final static Singleton_01 INSTANCE = new Singleton_01();    public static Singleton_01 getInstance(){        return INSTANCE;    }}
   复制代码
 
懒汉式
 /** * 懒汉式:并发有性能消耗 */public class Singleton_02 {    private Singleton_02(){}    private static Singleton_02 instance;    public static synchronized Singleton_02 getInstance(){        if (instance == null){            instance = new Singleton_02();        }        return instance;    }}
   复制代码
 
双重检查懒汉式
 /** * 双重检查:可过滤一部分入锁操作,性能优于懒汉式 */public class Singleton_03 {    private Singleton_03(){}    private static Singleton_03 instance;
    public static Singleton_03 getInstance(){        if (instance == null){            synchronized (Singleton_03.class){                if (instance == null){                    instance = new Singleton_03();                }            }        }        return instance;    }}
   复制代码
 
静态内部类
 /** * 静态内部类,具备延时加载特性 */public class Singleton_04 {    private Singleton_04(){}    private static class SingletonInstance {        private static final Singleton_04 INSTANCE = new Singleton_04();    }    public static Singleton_04 getInstance(){        return SingletonInstance.INSTANCE;    }}
   复制代码
 
枚举
 /** * 枚举 */public enum  Singleton_05 {    INSTANCE;}
   复制代码
 
适配器模式
适配器模式有 2 种实现方式。
类适配器:继承
对象适配器:组合+委托
类适配器类图
demo
usb c 适配到 usb a
 public interface UsbC {    void charge();}public class UsbA {    public void chargeA(){        System.out.println("usb a 充电");    }}public class UsbAAdaptor extends UsbA implements UsbC {    @Override    public void charge() {        System.out.println("转换 成usb a 充电");        this.chargeA();    }}
   复制代码
 
对象适配器类图
demo
usb c 适配到 usb b
 public interface UsbC {    void charge();}public class UsbB {    public void chargeB(){        System.out.println("usb b 充电");    }}public class UsbBAdaptor implements UsbC {    private UsbB usbB;    public UsbBAdaptor(UsbB usbB){        this.usbB = usbB;    }    @Override    public void charge() {        System.out.println("转换 成usb b 充电");        usbB.chargeB();    }}
   复制代码
 
模版方法模式
模板方法模式在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤。
作用:复用和扩展
典型应用:junit ,servlet
策略模式
定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端代指使用算法的代码)
策略模式的类图
demo
 public interface NotificationStrategy {    void send();}public class EmailStrategy implements NotificationStrategy{    @Override    public void send() {        System.out.println("send email");    }}public class SMSStrategy implements NotificationStrategy{    @Override    public void send() {        System.out.println("send sms");    }}import java.util.HashMap;import java.util.Map;public class NotificationStrategyFactory {    private static Map<String,NotificationStrategy> strategys = new HashMap<>();    static {        strategys.put("sms",new SMSStrategy());        strategys.put("email",new EmailStrategy());    }    public static NotificationStrategy createStrategy(String type){        return strategys.get(type);    }}public class Test {    public static void main(String[] args) {        NotificationStrategy sms = NotificationStrategyFactory.createStrategy("sms");        sms.send();    }}
   复制代码
 
组合模式
将一组对象组织(Compose)成树形结构,以表示一种“部分 - 整体”的层次结构。组合让客户端(在很多设计模式书籍中,“客户端”代指代码的使用者。)可以统一单个对象和组合对象的处理逻辑。
使用组合模式的前提在于,你的业务场景必须能够表示成树形结构
demo
组合模式的demo
装饰器模式
类图
demo
 public class Hairdryer {    public void blow(){        System.out.println("吹风 ...");    }}public abstract class HairdryerDecorator extends Hairdryer {    protected Hairdryer hairdryer;    public HairdryerDecorator(Hairdryer hairdryer){        this.hairdryer = hairdryer;    }}public class HotHairdryerDecorator extends HairdryerDecorator {    public HotHairdryerDecorator(Hairdryer hairdryer) {        super(hairdryer);    }    private void hot(){        System.out.println("加热 ...");    }    @Override    public void blow() {        hot();        super.blow();    }}public class CoolHairdryerDecorator extends HairdryerDecorator {    public CoolHairdryerDecorator(Hairdryer hairdryer) {        super(hairdryer);    }    private void cool(){        System.out.println("制冷 ...");    }    @Override    public void blow() {        cool();        super.blow();    }}public class Test {    public static void main(String[] args) {        Hairdryer hairdryer = new HotHairdryerDecorator(new Hairdryer());        hairdryer.blow();    }}
   复制代码
 
设计模式在项目中的应用
junit 中用的设计模式
模版方法模式,策略模式,组合模式,装饰者模式
spring 种的设计模式或原则
ioc 容器:依赖注入(通常注入有种方式:构造器注入和 setter 注入)
单例模式:spring 的 beans factory 默认创建单例对象
mvc 分层模式
评论