设计模式
文章平均质量分 63
zhangjin1120
这个作者很懒,什么都没留下…
展开
-
设计模式8:代理模式-动态代理
动态代理的核心优势就在于,一个代理类,可以代理多个接口。动态代理只能把代理对象,赋值给接口,如上面的例子。不能把代理对象直接赋值一个普通类。而Cglib代理可以做到。具体怎么做的,下篇文章再讲。,其实就是用java或kotlin代码申请权限,而不是在AndroidManifest.xml文件里面。,静态代理中一个代理类只能代理一个接口,其他不同的接口,就需要再手写不同的代理类,这就很。都是我们手写的代理类。动态代理可以自动生成代理类。动态代理类似于在安卓里面,我们常说的。动态代理需要jdk中提供的两个类。原创 2023-09-04 00:22:27 · 2029 阅读 · 0 评论 -
面向对象的六大设计原则
开闭原则(Open Close Principle)对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类。里氏代换原则(Liskov Substitution Principle)任何基类可能出现的地方,子类一定可以出现。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是原创 2021-09-23 21:27:57 · 144 阅读 · 0 评论 -
23种设计模式
这23种设计模式对java和C++都有效。分类名称已解析是否常用常见创建型模式1工厂模式创建型模式2抽象工厂模式创建型模式3单例模式常用创建型模式4建造者模式创建型模式5原型模式结构型模式1适配器模式常见结构型模式2装饰者模式结构型模式3代理模式常见结构型模式4外观模式结构型模式5桥接模式结构型模式6组合模式结构型模式7享元模式行为型模式1原创 2021-07-13 14:45:37 · 108 阅读 · 0 评论 -
设计模式1:工厂模式
外部创建对象时,不需要看到对象复杂的创建过程,或者不希望向外部暴露创建过程的情况下,可以使用工厂模式。工厂模式的目的将创建对象的具体过程屏蔽隔离起来。原创 2023-06-19 18:26:36 · 894 阅读 · 0 评论 -
设计模式2:抽象工厂模式
中,已经描述了抽象工厂模式和简单工厂、工厂方法模式的区别。这篇继续针对抽象工厂模式刨根问底。原创 2023-06-19 19:11:35 · 257 阅读 · 0 评论 -
设计模式3:单例模式:静态内部类模式是怎么保证单例且线程安全的?
测试了静态内部类单例模式,确实只生成了一个实例。原创 2023-07-05 22:48:40 · 769 阅读 · 0 评论 -
设计模式3:单例模式:静态内部类单例模式
单例模式最简单的写法就是静态内部类单例模式,如下:public class Manager { private static class ManagerHolder { private static Manager instance = new Manager(); } private Manager() { } public static Manager getInstance() { return Manag.原创 2021-12-21 21:12:18 · 3962 阅读 · 0 评论 -
设计模式3:单例模式:volatile关键字能不能解决多线程计数问题?
先说结论不能:执行环境:jdk1.8.0_372 CPU:intel i7-4960 2.6GHz。原创 2023-06-28 11:50:14 · 501 阅读 · 0 评论 -
设计模式3:单例模式:JMM与volatile和synchronized的关系
Java 内存模型指定 Java 虚拟机如何使用计算机内存 (RAM)。Java 虚拟机是整个计算机的模型,因此该模型自然包括内存模型 - 又称为 Java 内存模型。如果您想设计行为正确的并发程序,那么了解 Java 内存模型非常重要。Java内存模型指定不同线程如何以及何时可以看到其他线程写入共享变量的值,以及如何在必要时同步对共享变量的访问。原来的Java内存模型是不够的,所以在Java 1.5中对Java内存模型进行了修改。原创 2023-06-27 23:42:15 · 597 阅读 · 0 评论 -
设计模式3:单例模式:堆中对象是线程共享的,为什么还需要用volatile来修饰对象?
volatile有两个作用,一是禁止指令重排序,二个是保证共享变量对所有线程的内存可见性。禁止指令重排序,在单例模式中防止出现空指针异常。对于保证内存可见性,堆中对象明明是线程共享的,为什么还需要用volatile来修饰对象? 多线程堆共享变量的修改分为很多步骤。举个简单的例子:public class VolatileTest { private static boolean flag = true; public static void main(String[原创 2021-10-25 17:04:39 · 965 阅读 · 0 评论 -
设计模式3:单例模式梳理
这种方式使得我们可以管理多种类型的单例,并且在使用时可以通过统一的接口进行获取操作,降低了用户的使用成本,也对用户隐藏了具体实现,降低了耦合度。这种写法能够在多线程中很好的工作,但是每次调用getInstance方法时都需要进行同步,造成不必要的同步开销,而且大部分时候我们是用不到同步的,所以不建议用这种模式。懒汉模式申明了一个静态对象,在第一次使用时初始化,虽然节约了资源,但第一次加载时需要实例化,反应稍慢一些,而且在多线程不能正常工作。似乎静态内部类看起来已经是最完美的方法了,其实不是,可能还存在。原创 2021-10-11 21:12:51 · 73 阅读 · 0 评论 -
设计模式4:建造者模式
以上代码只是分析,在实际应用中用String,还是用StringBuilder,StringBuffer,还是要具体情况具体分析。具体某个工厂是如何生产产品的,如果比较复杂,可以采用建造者模式。中写了一个简单的网络请求,可以看到,Okhttp的request是通过Builder生成的。EventBus不仅可以创建单例对象,还可以创建可配置对象,这种情况应用的少。工厂模式更加宏观一些,工厂模式主要目的的是通过不同的工厂,得到不同种类的产品。要创建的对象,初始化过程比较复杂,参数较多,参数又是可选可配置的。原创 2023-06-20 13:00:50 · 754 阅读 · 0 评论 -
设计模式5:原型模式
如果对象中的数据需要经过复杂的计算才能得到(比如排序、计算哈希值),或者需要从 RPC、网络、数据库、文件系统等非常慢速的 IO 中读取,这种情况下,我们就可以利用原型模式,从其他已有对象中直接拷贝得到,而不用每次在创建新对象的时候,都重复执行这些耗时的操作。如果对象的创建成本比较大,而同一个类的不同对象之间差别不大,在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式来创建新对象,以达到。如果对象的创建成本比较大,可以基于已有的原型对象通过来创建新的对象,节省创建时间。原创 2023-06-24 18:30:27 · 551 阅读 · 0 评论 -
设计模式6:适配器模式:充电器实例
ListView和RecyclerView都会用到Adpater,这个Adapter的中文意思就是适配器,那么Adapter和适配器模式到底有没有关系了?所以先搞清楚,什么是适配器模式?适配器模式有三种:类适配器模式、对象适配器模式、接口适配器模式。这篇主要理清楚类适配器模式。手机充电器的实例,代码参考:适配器模式(java实现)。首先,手机充电需要5v的充电器,定义一个5v充电接口:// 使用5V充电public interface Charge5V { void charging().原创 2021-06-25 17:14:54 · 359 阅读 · 1 评论 -
设计模式6:适配器模式:ListView中的适配器模式到底是类适配器还是对象适配器?
ListView做为client,它需要的目标接口(target interface)就是ListAdapter接口。成员变量实现getCount(),getItem(),getView()方法。所以ListView中的适配器模式是对象适配器模式,并不是类适配器模式。ArrayAdapter在构造器中接受了ArrayList对象,赋值给。以下是Android 6.0版本的源代码。适配器是ArrayAdapter。分析的蛮好,但是有误导。原创 2023-06-27 09:08:38 · 814 阅读 · 0 评论 -
设计模式6:适配器模式
类的适配器模式类中已有的方法,不支持新的接口。适配器类继承原有的类,并且实现新的接口。适配器类继承的目的是为了兼容原有的功能。对象的适配器模式(常用)类中已有的方法,不支持新的接口。适配器类持有原有类的对象,并且实现新的接口。与类的适配器模式不同,对象的适配器模式不采用继承的方式来实现兼容,而是采用持有原有类的对象的方式实现兼容。这一点符合合成复用原则(尽量使用关联关系来替代继承关系)。接口的适配器模式(常用)接口中抽象方法太多,实现类必须实现一些不需要的抽象方法。解决办法是使用抽象原创 2021-10-22 16:27:31 · 84 阅读 · 0 评论 -
设计模式7:装饰者模式
个人理解:原始接口功能不足,需要添加新方法,但是别的地方已经实现了原始接口,所以原始接口又不能直接添加方法。这时候可以采用持有原始类对象,并且添加新方法的方式,实现新功能。并且继承原始类或者实现原始接口,达到可替换原始类的目的。官方说法:装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。例如原始类有裤子,但是没有鞋子,这个时候用装饰器模式。原始类有鞋子,但是鞋码大了,不合适,这个时候用适配器模式。适配器模式解决的是原始类有这个功能,但是功能不匹配的问题。原创 2023-07-06 12:57:34 · 413 阅读 · 0 评论 -
设计模式8:代理模式
代理模式有哪几种?静态代理动态代理cglib代理代理模式的使用场景代理模式与网络代理有关吗?原创 2021-10-24 13:24:21 · 70 阅读 · 0 评论 -
设计模式8:代理模式-静态代理的实例:Thread类
静态代理有如下要素:目标角色(真实角色)。代理角色。目标角色和代理角色实现同一接口。代理角色持有目标角色的引用。参考:静态代理实例原创 2020-12-17 21:45:06 · 198 阅读 · 0 评论 -
设计模式8:代理模式-静态代理
我尝试在JDK、Android SDK和一些出名的库中,寻找静态代理的源码,没能找到。如果有读者发现,欢迎评论或者私信我。原创 2023-08-20 23:15:17 · 1193 阅读 · 0 评论 -
设计模式12:享元模式java线程池
享元模式的适用场景是什么?围棋设计。为什么要用享元模式?节省内存开销。原创 2020-11-29 03:53:15 · 371 阅读 · 0 评论 -
设计模式16:迭代器模式
迭代器模式(Iterator Pattern)有叫做游标(Cursor)。迭代器模式在jdk中,List.java Collection.java接口里,都有抽象方法: Iterator<E> iterator();迭代器的作用普通的fori循环, 只能遍历list,不能遍历Collection普通的for循环,如果在循环内部做删除操作,易出错,且危险。未完待续。参考:Iterator vs for...原创 2021-08-19 20:41:59 · 56 阅读 · 0 评论