概述
1、单例模式
单例模式在我以前的博客中给过六种,有详解,大家可以参考
【Java】浅析单例模式(六种单例模式的代码实现及详解)
2、代理模式:
【真正实现内容的是代理委托类】
动态代理是在运行时根据我们在Java代码中的“指示”动态生成的。
相比于静态代理,动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类中的方法。
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、简单工厂(静态工厂方法)
优点:只需要传入一个正确的参数,就可以获取所需要的对象而无须知道其创建细节。
缺点:工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背开闭原则。
抽象产品角色
*/
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逻辑判断
**缺点:**添加新产品时,除了增加新产品类外,还要提供与之对应的具体工厂类;系统类的个数将成对增加,在一定程度上增加了系统的复杂度更多的类需要编译和运行,会给系统带来一些额外的开销;
* 创建产品类,定义具体产品的公共接口
*/
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、有更好的扩展性。实现适配器,可以调用自己开发的功能
缺点:当滥用适配器模式的时候容易造成混乱
/**
* 有个传统的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.策略模式满足“开-闭原则”。当增加新的具体策略时,不需要修改上下文类的代码,上下文就可以引用新的具体策略的实例。
抽象策略类
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、状态模式:
优点:多个环境共享一个状态对象,减少系统中对象的个数
缺点:当状态状态比较多的时候,代码就变得冗杂,同时也没有遵循代码的开闭原则
与策略模式的区别:策略模式是结婚前可以不停的换女朋友,而状态模式是结婚了只能给一个老婆跑前跑后。 再通俗一点,就是策略模式服务的对象是不固定的,但是状态模式服务的对象是固定的,每次都是那一个
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】常用的设计模式简介所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复