我是靠谱客的博主 还单身蚂蚁,最近开发中收集的这篇文章主要介绍【Java】常用的设计模式简介,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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】常用的设计模式简介所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部