JAVA【设计模式】单一职责原则

一、设计模式的规范

设计模式遵循六⼤原则;单⼀职责( ⼀个类和⽅法只做⼀件事 )、⾥⽒替换( 多态,⼦类可扩展⽗类 )、依赖
倒置( 细节依赖抽象,下层依赖上层 )、接⼝隔离( 建⽴单⼀接⼝ )、迪⽶特原则( 最少知道,降低耦合 )、开闭
原则( 抽象架构,扩展实现 ),会在具体的设计模式章节中,进⾏体现。

二、单⼀职责

定义:一个类只有一个发生变化的原因
在这里插入图片描述

三、示例

模拟场景:不同等级的用户可以看到不同格式的视频,vip用户可以看到1080p视频,而访客用户只能看480p视频

未有单一职责原则的设计(传统设计):

package com.qf.principle.single.trandition;

public class VideoUserService {

    /**
     * 缺点:随着用户类型的增多,代码会出现多个else if的判断,代码变得非常的冗余难以维护
     * @param userType
     */
    public void serviceGrade(String userType){
        if ("VIP用户".equals(userType)){
            System.out.println("VIP用户 1080P视频");
        }else if ("普通用户".equals(userType)){
            System.out.println("普通用户 720P视频");
        }else if ("访客用户".equals(userType)){
            System.out.println("访客用户 480P视频");
        }
    }
}

package com.qf.principle.single.trandition;

public class ApiTest {
    public static void main(String[] args) {
        VideoUserService videoUserService=new VideoUserService();
        videoUserService.serviceGrade("VIP用户");
        videoUserService.serviceGrade("普通用户");
        videoUserService.serviceGrade("访客用户");
    }
}

总结:违背了开背原则,对扩展开放对修改关闭。随着用户类型的增多,代码会出现多个else if的判断,代码变得非常的冗余难以维护。

单一职责原则设计:

定义接口:IVideoUserService,方法:definitionadvertisement

package com.qf.principle.single.design;

public interface IVideoUserService {

    /**
     * 用户的定义
     */
    void definition();

    /**
     * 是否需要看广告
     */
    void advertisement();
}

package com.qf.principle.single.design.impl;

import com.qf.principle.single.design.IVideoUserService;

/**
 * 访客用户
 */
public class GuestVideoUserService implements IVideoUserService {

    @Override
    public void definition() {
        System.out.println("访客用户 480P视频");
    }

    @Override
    public void advertisement() {
        System.out.println("需要看广告");
    }
}

package com.qf.principle.single.design.impl;

import com.qf.principle.single.design.IVideoUserService;

/**
 * 普通用户
 */
public class OrdinaryVideoUserService implements IVideoUserService {
    @Override
    public void definition() {
        System.out.println("普通用户 720P视频");
    }

    @Override
    public void advertisement() {
        System.out.println("无需看广告");
    }
}

package com.qf.principle.single.design.impl;

import com.qf.principle.single.design.IVideoUserService;

/**
 * vip用户
 */
public class VIPVideoUserService implements IVideoUserService {
    @Override
    public void definition() {
        System.out.println("VIP用户 1080P视频");
    }

    @Override
    public void advertisement() {
        System.out.println("无需看广告");
    }
}

package com.qf.principle.single.design;

import com.qf.principle.single.design.impl.GuestVideoUserService;
import com.qf.principle.single.design.impl.OrdinaryVideoUserService;
import com.qf.principle.single.design.impl.VIPVideoUserService;

public class ApiTest {
    public static void main(String[] args) {
        //vip用户
        IVideoUserService vipVideoUser=new VIPVideoUserService();
        vipVideoUser.advertisement();
        vipVideoUser.definition();

        //普通用户
        IVideoUserService ordinaryUser=new OrdinaryVideoUserService();
        ordinaryUser.advertisement();
        ordinaryUser.definition();

        //访客用户
        IVideoUserService guestUser=new GuestVideoUserService();
        guestUser.advertisement();
        guestUser.definition();
    }
}

关系图

在这里插入图片描述
总结:利用多态的特性,每新增一个用户类型只需要,多创建一个用户类,去实现接口,这样保证了代码的扩展性和可维护,可读性。

posted @ 2022-08-30 22:40  雾托邦  阅读(44)  评论(0编辑  收藏  举报