Head First Of Design Pattern

2019-03-27 23:43 评论 0 条

摘要

Head First Design Patterns是一本通俗、细致、容易理解的设计模式书籍,整理书中涉及的各个例子源码,并绘制UML类图,加深对常用设计模式的理解

1、适配器模式

包装一个对象,来提供不同的接口 源码例子

适配器模式

2、代理模式

代理对象持有被代理对象的引用,通过代理对象简介访问被代理对象,来控制对被代理对象的访问(重点学习动态代理涉及反射知识) 源码例子

动态代理弥补了普通代理删除或增加接口方法需要改动多个类的不足,动态代理无论接口方法怎么变化都不受影响

代理模式

定义一个接口

public interface IProgrammer {
       void developApp();
       void developWebSite();
       void developServer();
}

真实的对象实现接口的方法

public class RealSubject implements IProgrammer {

    @Override
    public void developApp() {
        System.out.println("客户需要开发一个包含Android客户端、iPhone客户端的APP");

    }

    @Override
    public void developWebSite() {
        System.out.println("客户需要开发一个PC端网站");

    }

    @Override
    public void developServer() {
        System.out.println("客户需要开发一个服务于APP和PC网站的后台");

    }

}

假的对象调用真实对象的方法

public class ProgramTestDrive {

    /**
     * @param args
     */
    public static void main(String[] args) {
        //被代理类
        RealSubject realSubject = new RealSubject();

        Class<?> clazz = realSubject.getClass();
        ClassLoader loader = clazz.getClassLoader();

        OwnerInvocationHandler handler = new OwnerInvocationHandler(realSubject);
        IProgrammer iProgrammer = new ProxySubject().getOwnerProxy(loader,
                new Class[] { IProgrammer.class }, handler);

        iProgrammer.developApp();
        iProgrammer.developWebSite();
        iProgrammer.developWebSite();
    }

}
public class ProxySubject {

    /**
     * 返回一个代理类
     * @param loader
     * @param clazz
     * @param handler
     * @return
     */
    public IProgrammer getOwerProxy(ClassLoader loader, Class<?> clazz[],
            InvocationHandler handler) {
        return (IProgrammer) Proxy.newProxyInstance(loader, clazz, handler);
    }
}

动态代理模式简化的样子

//被代理的类
IProgrammer realSubject=new RealSubject();

//代理类
IProgrammer proxySubject=Proxy.newProxyInstance(classLoader,new Class[]{IProgrammer.class},new InvocationHandler());

//使用代理类访问接口提供的方法,用户只和代理类交互,起到保护被代理类的目的
proxySubject.developApp();
proxySubject.developWebSite();
proxySubject.developWebSite();

Proxy属于java.lang.reflect反射包下的类,传入一个真实对象的ClassLoader,真实对象实现的接口和java.lang.reflect包下InvocationHandler的一个子类,得到一个代理的对象,代理对象实现真实对象一样的接口,所以可以调用真实对象实现的接口方法

3、外观模式

包装多个对象,以简化它们的接口 源码例子

4、装饰者模式

包装另一个对象,并提供额外的行为

装饰者模式

例子源码相关类,绘制装饰者UML图 源码例子

装饰者UML图谱例子1

5、命令模式

把请求封装成对象,这可以让你使用不同的请求、队列或日志请求来参数化其他对象 源码例子

命令模式

6、迭代器模式

提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示 源码例子

迭代器模式

7、组合模式

允许你将对象组合成树形结构来表现“整体/部分”的层次结构 源码例子

组合模式

8、工厂模式

定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个 源码例子

工厂模式

9、抽象工厂模式

提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类 源码例子

抽象工厂模式

10、观察者模式

定义了对象之间一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新 源码例子

观察者模式

11、单例模式

确保一个类只有一个实例,并提供一个全局访问点 源码例子

单例模式

Note that:单例模式分为饿汉式、懒汉式、Double CheckLock

12、状态模式

允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类 源码例子

状态模式

13、策略模式

定义了算法族,分别封装起来,让它们之间可以互相代替,让算法的变化独立于使用算法的客户 源码例子

策略模式

14、模板方法模式

在一个方法中定义一个算法的骨架,而将一些步骤延伸到子类中,使得子类在不改变算法结构的情况下,重新定义算法中的某些步骤 源码例子

当前文章价值2元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)

你可能感兴趣的文章

来源:每日教程每日一例,深入学习实用技术教程,关注公众号TeachCourse
转载请注明出处: https://www.teachcourse.cn/2703.html ,谢谢支持!

资源分享

Python框架JWT实现登录token生成和接口校验 Python框架JWT实现登录token
Conversion to Dalvik format failed Conversion to Dalvik format
性能优化实践一 性能优化实践一
Ubuntu系统Python项目运行脚本 Ubuntu系统Python项目运行脚本

发表评论

呲牙 憨笑 坏笑 偷笑 色 微笑 抓狂 睡觉 酷 流汗 鼓掌 大哭 可怜 疑问 晕 惊讶 得意 尴尬 发怒 奋斗 衰 骷髅 啤酒 吃饭 礼物 强 弱 握手 OK NO 勾引 拳头 差劲 爱你

表情