
设计模式
ohoy
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
设计模式分类
被问到常用的设计模式可回答:工厂模式、单例模式、建造者模式、适配器模式、策略模式、模板方法模式、责任链模式。设计模式分为三大类:创建型、结构型、行为型三大类。原创 2024-02-28 10:48:51 · 374 阅读 · 0 评论 -
静态代理做个日志记录demo
使用静态代理做个日志记录原创 2022-12-08 11:25:37 · 231 阅读 · 0 评论 -
适配器模式
简单讲解一下适配器模式原创 2022-06-02 20:25:08 · 99 阅读 · 0 评论 -
SpringBoot之策略模式实现不同消息处理
概述大体看个样例,描述的是,消息有多种类型,每种类型对应不同的策略,该如何设计呐?demo首先需要有个抽象类,在类中共用的方法,设计为protected,需要各个类处理的方法,设计为abstract方法,如下假设有登录和Normal消息要处理,之类改如何设计呐?首先加个@Component注解,在注解中用MessageHandler.消息类型的方式标明一个类,类似这样,外界只需要给一个消息类型,那么就可以通过SpringContextUtil.getBean(“MessageHandler”原创 2022-05-31 11:25:12 · 489 阅读 · 0 评论 -
迭代器模式
概述迭代器模式可以用来遍历集合对象,也可以叫容器,迭代器模式将集合对象的遍历操作从集合类中拆分出来,放到迭代器类中,让两者的职责更加单一demo它主要涉及方法一个是next,另一个是hasNext,public class ArrayIterator<E> implements Iterator<E> { private ArrayList<E> arrayList = new ArrayList<>(); private int c原创 2021-01-25 21:48:07 · 87 阅读 · 0 评论 -
职责链模式
概述有这样一个需求,要求过滤一个广告、政治的敏感关键词,要求用职责链模式来完成职责链是什么呐?职责链是指,多个处理器以此处理同一个请求。一个请求先经过A处理器处理,然后再把请求传递给B处理器,B处理器处理完后再传递给C处理器,依此类推,形成一个链条。链条上的每个处理器各自承担各自的处理职责,所以叫责任链模式demopublic interface SensitiveWordFilter { boolean doFileter(Content content);}public class原创 2021-01-25 15:48:36 · 84 阅读 · 0 评论 -
策略模式应用-取代判断范围的if...else语句
概述策略模式是指包含一个策略接口和一组实现这个接口的策略类,它的应用有很多,其中一种就是取代if…else语句,来看个例子demo有这样一个需求,一个文件里可能存放着大概0~100G的用逗号分隔开的数字,要求根据文件的大小选择不同的算法,对文件中的数字进行排序一开始代码是这样的public void sortFile(String filePath){ File file = new File(filePath); long fileSize = file.len原创 2021-01-21 21:54:24 · 495 阅读 · 0 评论 -
观察者模式+反射对Event Bus框架做一个简单的探究
概述我们知道Google Guava的EventBus类使用了,register() 函数用来注册观察者,通过post() 函数发送消息的时候,并非把消息发送给所有的观察者,是观察者模式典型的应用下面对案例做个简单的探究demo有如下这几个类,期间的关系如图所示:可能会涉及到其他的东西,会加在代码注释中...原创 2021-01-20 17:18:08 · 170 阅读 · 0 评论 -
观察者模式与多线程
概述在对象之间定义一个被观察者和多个观察者,当被观察者的状态改变的时候,所有观察者都回自动收到通知demo有一个注册接口的需求,注册后,发放体验金和发送邮件,发放体验金和发送邮件为观察者由被观察者根据需要使用多线程调用,如图public class UserController { private List<UserObserver> userObserves = new ArrayList<>(); public String register(St原创 2021-01-20 11:57:01 · 1008 阅读 · 0 评论 -
享元模式与装箱、拆箱
demo如下,代码: Integer i1=56; Integer i2=56; Integer i3=129; Integer i4=129; System.out.println(i1==i2); System.out.println(i3==i4);第一个返回true,第二个返回false当用valueOf来创建Integer对象的时候,因为Integer用到了享元模式来复用对象,才导致了这样的运行结果。当我原创 2021-01-19 16:25:31 · 147 阅读 · 0 评论 -
享元模式
概述当一个系统中存在大量重复对象的时候,如果这些重复的对象是不可变的对象,我们就可以利用享元模式将对象设计成享元,在内存中只保留一份实例,供多处代码引用。这样可以减少内存中对象的数量,起到节省内存的目的。demopublic class ChessPieceUnit { private static final Map<String, ChessPieceUnit> chessMap = new ConcurrentHashMap<>(); private原创 2021-01-19 11:08:53 · 96 阅读 · 0 评论 -
SpringAOP的应用
概述有这样一个需求,在请求中带有缓存字段(比如http://…&cached=true),我们则尝试从缓存中获取数据返回,用代理模式或AOP来做democache类:public interface Cache { Result getCacheData(String userName);}实现类:@Componentpublic class CacheProxy implements Cache{ @Autowired private Redis原创 2021-01-12 22:22:19 · 130 阅读 · 0 评论 -
代理模式
概述代理模式是指,通过引入代理类来给原始类附加功能静态代理public interface UserInfoOperation { Result login(WeiboUserInfo userInfo);}@RestController@RequestMapping("/weiboUserInfo")public class WeiboUserInfoController2 implements UserInfoOperation{ @Autowired priv原创 2021-01-12 15:50:12 · 91 阅读 · 0 评论 -
原型模式
概述我们假设这样一个场景,在一个Map中存储着关键词和关键词搜索对象,关键词对象包括关键词被搜索的次数及搜索次数更新时间。数据库中这个对象会被更新,也会有新的关键词被重新写进来。我们需要将这些数据都存到索引Map中,并且尽可能的较少数据库的访问操作demo...原创 2021-01-11 20:47:28 · 112 阅读 · 0 评论 -
建造者模式
概述对于建造者模式,我的理解是建造者是用来构建对象的,那么为什么要用一个类来充当建造者呐,我认为原因是,当被建造对象承担了过多的任务,那么被建造对象中的代码就会显得很杂很乱,在这种情况下,引入一个建造者,将被建造对象的校验任务仍给建造者,这样就会使得被建造对象中的代码职责单一,便于维护。demo看个需求,对于ConstructorArg类,要求用建造者模式完成如下任务,1.当isRef为true的时候,arg表示String类型,当isRef为false时,arg、type都需要设置public原创 2021-01-06 11:22:31 · 103 阅读 · 0 评论 -
用工厂模式+反射对依赖注入做个探究
概述最近在学工厂模式,结合以前学的反射来对依赖注入做个简单的探究大体思路是有一个实体BeanDefinition记录类的信息,而XmlBeanConfigParser负责解析xml文件,并将实体信息传给BeansFactory,BeansFactory根据实体信息创建相应的对象,如图demoClassPathXmlApplication类:public class ClassPathXmlApplication { private BeansFactory beansFactory;原创 2021-01-04 22:33:13 · 188 阅读 · 1 评论 -
使用多态特性代替if...else语句
概述一个简单的案例,探究一下java多态的运用demopublic static Parse createParser(String configFormat) throws Exception { Parse parser = null; if ("json".equalsIgnoreCase(configFormat)){ parser = new JsonParse(); }else if ("xml".equalsIg原创 2021-01-04 13:33:25 · 1058 阅读 · 2 评论 -
单例模式的传参
概述创建单例类的时候应该支持参数的传递,比如我们创建一个连接池的单例对象,就需要通过参数来指定连接池的大小,怎么做呐?public class IdGeneratorLh { //单例模式,懒汉式 private AtomicLong id = new AtomicLong(); //创建一个静态实例,方便外界获取 private static IdGeneratorLh instance; private static int size; priva原创 2020-12-30 16:40:00 · 1544 阅读 · 0 评论 -
单例模式的应用
概述单例模式是一个类,主要作用是在全局模式下生成唯一的一个类,为此在业务概念上,如果有些数据在系统中只应保存一份,那就比较适合设计为单例类,比如日志记录类,Logger,或是全局下唯一递增ID号码生成器需求有一个单例模型设计出来的唯一ID生成器,我们需要在高并发环境下测试这个唯一ID生成器是否真能生成唯一的IDpublic class IdGeneratorScjc { //创建你需要的类 private AtomicLong id = new AtomicLong(); p原创 2020-12-28 23:03:59 · 265 阅读 · 0 评论 -
单例模式
概述单例模式是指,一个类只允许创建一个对象(或者实例),具体的实现方式有饿汉式单例模式主要的一个需要将构造函数设置为private访问权限的,这样才能避免外部通过new创建实例public class IdGenerator { //AtomicLong是一个Java并发库中提供的一个原子变量类型 //它将一些线程不安全需要加锁的符合操作封装为线程安全的原子操作 private static AtomicLong id = new AtomicLong(0); //原创 2020-12-28 14:41:55 · 110 阅读 · 1 评论 -
策略模式和工厂模式的组合使用+枚举替换if...else语句
demo//有这样一个逻辑代码块String medalType = "guest";if("guest".equals(medalType)){ System.out.println("嘉宾勋章");}else if("vip".equals(medalType)){ System.out.println("会员勋章");}else if("vip".equals(medalType)){ System.out.println("展示守护勋章");}如何去解构这个代码呐?我们把每个原创 2020-12-02 13:51:29 · 946 阅读 · 0 评论