我是靠谱客的博主 还单身蚂蚁,这篇文章主要介绍【Java】常用的设计模式简介,现在分享给大家,希望可以做个参考。

1、单例模式
单例模式在我以前的博客中给过六种,有详解,大家可以参考
【Java】浅析单例模式(六种单例模式的代码实现及详解)
2、代理模式:
【真正实现内容的是代理委托类】
动态代理是在运行时根据我们在Java代码中的“指示”动态生成的。
相比于静态代理,动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类中的方法。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public interface IUser { void talk(); } 实现类 public class User implements IUser { @Override public void talk() { System.out.println("doing User.talk"); } } 要是先动态代理,首先创建一个实现InvocationHandler这个接口的类 public class UserProxy implements InvocationHandler { private Object object; public UserProxy(Object object){ super(); this.object = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("doing UserProxy.invoke"); method.invoke(object, args); System.out.println("doing UserProxy.invoke end"); return null; } /** * 实现InvocationHandler接口要重写invoke方法,方法的三个参数分别: * proxy:就是动态代理生成的代理类对象 * method:就是调用的方法 * args:表示该方法的参数 */ }

实现:Spring中AOP的原理 是使用JDK动态代理和cglib动态代理技术来实现的
3、简单工厂(静态工厂方法)
优点:只需要传入一个正确的参数,就可以获取所需要的对象而无须知道其创建细节。
缺点:工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背开闭原则。
在这里插入图片描述

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
抽象产品角色 */ public abstract class Video { public abstract void produce(); } --------------------------------------------- /** * 具体产品角色 */ public class JavaVideo extends Video { @Override public void produce() { System.out.println("java 课程视频"); } } /** * 具体产品类型 */ public class CVideo extends Video{ @Override public void produce() { System.out.println("C 课程视频"); } } --------------------------------------------- /** * 工厂角色 */ public class VideoFactory { public Video getVideo(String videoType){ if ("java".equalsIgnoreCase(videoType)){ return new JavaVideo(); } else if ("c".equalsIgnoreCase(videoType)) { return new CVideo(); } return null; } public Video getVideo(Class clazz){ Video video = null; try { video = (Video) clazz.forName(clazz.getName()).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return video; } }

实现:Spring中Bean的实例化——(三个方法-基于配置)静态工厂、普通工厂、无参构造
4、工厂方法设计模式:
**优点:**更符合开-闭原则
新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可–简单工厂模式需要修改工厂类的判断逻辑
符合单一职责原则
每个具体工厂类只负责创建对应的产品–简单工厂中的工厂类存在复杂的switch逻辑判断
**缺点:**添加新产品时,除了增加新产品类外,还要提供与之对应的具体工厂类;系统类的个数将成对增加,在一定程度上增加了系统的复杂度更多的类需要编译和运行,会给系统带来一些额外的开销;
在这里插入图片描述

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
* 创建产品类,定义具体产品的公共接口 */ public abstract class Video { public abstract void produce(); } /** * 抽象工厂类:定义具体工厂的公共接口 */ public abstract class Factory { public abstract Video structVideo(); } /** *具体产品-JAVA视频类 */ public class JavaVideo extends Video{ @Override public void produce() { System.out.println("Java 视频课程"); } } /** * 具体工厂-创建不同具体产品类的实例 */ public class JavaFactory extends Factory{ @Override public Video structVideo() { return new JavaVideo(); } } /** *具体产品-C视频类 */ public class CVideo extends Video { @Override public void produce() { System.out.println("C 课程视频"); } } /** * 具体工厂类-创建不同具体产品类的实例 */ public class CFactory extends Factory { @Override public Video structVideo() { return new CVideo(); } }

Spring实现:一般情况下,应用程序有自己的工厂对象来创建bean.如果将应用程序自己的工厂对象交给Spring管理,那么Spring管理的就不是普通的bean,而是工厂Bean
5、适配器模式:
优点:
1、有更好的复用性。系统需要使用现有的类,但此类接口不符合系统需要,通过适配器模式让这些功能得到很好的复用
2、有更好的扩展性。实现适配器,可以调用自己开发的功能
缺点:当滥用适配器模式的时候容易造成混乱
在这里插入图片描述

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/** * 有个传统的Micro USB的充电线 */ public interface MicroUSB { void isMicroUSB(); } public interface TypeC { void isTypeC(); } public class TypeCImpl implements TypeC { @Override public void isTypeC() { System.out.println("typec充电口"); } } /** *类适配器 * 整个适配器adapter,将MicroUSB 转化成typec */ public class Adapter extends TypeCImpl implements MicroUSB { @Override public void isMicroUSB() { isTypeC(); } } public class ObjectAdapter implements MicroUSB { private TypeC typeC; public ObjectAdapter(TypeC typeC) { this.typeC = typeC; } @Override public void isMicroUSB() { typeC.isTypeC(); } }

应用:IO流中字节流和字符流之间的转换
6、策略模式:
优点:
1.上下文和具体策略是松耦合关系。因此上下文只知道它要使用某一个实现Strategy接口类的实例,但不需要知道具体是哪一个类。
2.策略模式满足“开-闭原则”。当增加新的具体策略时,不需要修改上下文类的代码,上下文就可以引用新的具体策略的实例。
在这里插入图片描述

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
抽象策略类 public abstract class Strategy { //策略方法 public abstract void strategyMethod(); } //具体策略类A public class ConcreteStrategyA extends Strategy { @Override public void strategyMethod() { System.out.println("具体策略A的策略方法被访问!"); } } //具体策略类B public class ConcreteStrategyB extends Strategy { @Override public void strategyMethod() { System.out.println("具体策略B的策略方法被访问!"); } } //环境类 public class Context { private Strategy strategy; public Strategy getStrategy() { return strategy; } public void setStrategy(Strategy strategy) { this.strategy=strategy; } public void strategyMethod() { strategy.strategyMethod(); }

spring实现:当bean需要访问资源配置文件时,依赖注入方式需要获取rescource资源的位置,代码中耦合性太高,而今我们一直使用注解,依赖注入的方式去获取。
7、状态模式:
优点:多个环境共享一个状态对象,减少系统中对象的个数
缺点:当状态状态比较多的时候,代码就变得冗杂,同时也没有遵循代码的开闭原则
与策略模式的区别:策略模式是结婚前可以不停的换女朋友,而状态模式是结婚了只能给一个老婆跑前跑后。 再通俗一点,就是策略模式服务的对象是不固定的,但是状态模式服务的对象是固定的,每次都是那一个

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
public interface Discount { public void discount(String user,String clothName,Context context); } public class Discount9 implements Discount { @Override public void discount(String user,String clothName,Context context) { //某用户打九折 context.getCloth().put(user, discountType); System.out.println("打九折"); } } public class Discount5 implements Discount { @Override public void discount(String user,String clothName,Context context) { //某用户打五折 context.getCloth().put(user, discountType); System.out.println("打五折"); } } public class DiscountOff implements Discount { @Override public void discount(String user,String clothName,Context context) { // 恶意投票,取消用户的投票资格,并取消投票记录 String str = context.getCloth.get(user); if(str != null){ context.getCloth.remove(user); } System.out.println("被拉入黑名单"); } } public class Context { private Discount discount = null; //把每一个客户买了什么衣服记录下来 private Map<String,String> clothMap = new HashMap<String,String>(); //把每一个用户买了多少件衣服记录下来 private Map<String,Integer> clothCountMap = new HashMap<String,Integer>(); public Map<String, String> getCloth() { return cloth; } public void dicount(String user,String clothName){ //1.取得客户买了多少件了:然后为其增加一件 Integer oldClothCount = clothCountMap.get(user); oldClothCount += 1; mapVoteCount.put(user, oldClothCount); //2.根据客户购买的数量进行打折等处理 if(oldClothCount == 1){ discount = new Discount9(); } else if(oldClothCount == 2){ discount = new Discount5(); } else if(oldClothCount >= 3){ discount = new DiscountOff(); } //然后转调状态对象来进行相应的操作 discount.discount(user, clothName, this); } }

在这里插入图片描述

最后

以上就是还单身蚂蚁最近收集整理的关于【Java】常用的设计模式简介的全部内容,更多相关【Java】常用内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(86)

评论列表共有 0 条评论

立即
投稿
返回
顶部