您当前的位置: 首页 >  Java

小志的博客

暂无认证

  • 0浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

java设计模式——单一原则

小志的博客 发布时间:2020-05-03 23:44:01 ,浏览量:0

一、概念

1、定义:

  • 不要存在多于一个导致类变更的原因

2、简单理解定义:

  • 一个类、接口、方法只负责一项职责

3、优点:

  • 降低类的复杂度、提高类的可读性,提高系统的可维护性、降低变更引起的风险。
二、单一原则简单示例

1、示例1:

  • 没使用针对类级别的单一职责。

(1)、定义一个鸟类

package com.rf.rules.singleResponsibility;

/**
 * @description: 鸟类
 * @author: xiaozhi
 * @create: 2020-05-03 22:32
 */
public class Bird {
    //鸟的移动方式方法
    public void MoveMethod(String birdName){
        if(birdName.equals("喜鹊")){
            System.out.println(birdName+"用翅膀飞");
        }else{
            System.out.println(birdName+"用脚走");
        }

    }
}

(2)、定义一个测试类

package com.rf.rules.singleResponsibility;

/**
 * @description: 测试类
 * @author: xiaozhi
 * @create: 2020-05-03 22:33
 */
public class Test {
    public static void main(String[] args) {
        Bird bird=new Bird();
        bird.MoveMethod("喜鹊");
        bird.MoveMethod("鸵鸟");
    }
}

(3)、输出结果如下: 在这里插入图片描述

  • 使用针对类级别的单一职责

(1)、定义一个会飞的鸟类

package com.rf.rules.singleResponsibility;

/**
 * @description: 会飞的鸟类
 * @author: xiaozhi
 * @create: 2020-05-03 22:37
 */
public class FlyBird {
    //会飞的鸟的方法
    public void FlyMethod(String birdName){
        System.out.println(birdName+"用翅膀飞");
    }
}

(2)、定义一个只会行走的鸟类

package com.rf.rules.singleResponsibility;

/**
 * @description: 走路的鸟
 * @author: xiaozhi
 * @create: 2020-05-03 22:38
 */
public class WalkBird {
    //只能行走的鸟的方法
    public void walkBird(String birdName){
        System.out.println(birdName+"用脚走");
    }
}

(3)、定义一个测试类

package com.rf.rules.singleResponsibility;

/**
 * @description: 测试类
 * @author: xiaozhi
 * @create: 2020-05-03 22:33
 */
public class Test {
    public static void main(String[] args) {
    
        FlyBird flyBird=new FlyBird();
        flyBird.FlyMethod("喜鹊");
        
        WalkBird walkBird=new WalkBird();
        walkBird.walkBird("鸵鸟");
    }
}

(4)输出结果如下: 在这里插入图片描述(5)、类图如下:说明FlyBird类和WalkBird类的职责是单一的。 在这里插入图片描述 2、示例2:

  • 没有用到针对接口的级别的单一职责

(1)、定义一个课程接口类

package com.rf.rules.singleResponsibility;
/**
* @Description:  课程借口类
* @Param:
* @Author: xz
* @return:
* @Date: 2020/5/3 22:59
*/
public interface ICourse {

    //获取课程名称方法
    void  getCourseName();
    //获取课程视频方法
    void getCourseVideo();

    //学习课程方法
    void studyCourse();
    //退课方法
    void backCourse();


}

(2)、课程接口类有2个职责,一个是课程内容职责,一个是课程管理职责 在这里插入图片描述

(3)、定义一个课程接口实现类

package com.rf.rules.singleResponsibility;

import javax.swing.*;

/**
 * @description: 课程的实现类
 * @author: xiaozhi
 * @create: 2020-05-03 23:04
 */
public class ICourseImpl implements ICourse {
    @Override
    public void getCourseName() {
        System.out.println("课程名称");
    }

    @Override
    public void getCourseVideo() {
        System.out.println("课程视频");
    }

    @Override
    public void studyCourse() {
        System.out.println("学习课程");
    }

    @Override
    public void backCourse() {
        System.out.println("退还课程");
    }
}

(4)、类图如下:说明ICourse 接口职责不是单一的 在这里插入图片描述

  • 使用针对接口的级别的单一职责

(1)、定义一个课程内容接口

package com.rf.rules.singleResponsibility;
/** 
* @Description: 课程内容接口
* @Param:  
* @Author: xz  
* @return: 
* @Date: 2020/5/3 23:14  
*/ 
public interface IcourseContent {
    //获取课程名称方法
    void  getCourseName();
    //获取课程视频方法
    void getCourseVideo();
}

(2)、定义一个课程管理接口

package com.rf.rules.singleResponsibility;
/** 
* @Description: 课程管理接口
* @Param:  
* @Author: xz  
* @return: 
* @Date: 2020/5/3 23:14  
*/ 
public interface IcourseManager {
    
    //学习课程方法
    void studyCourse();
    //退课方法
    void backCourse();

}

(3)、定义一个课程实现类

package com.rf.rules.singleResponsibility;

/**
 * @description: 课程实现类
 * @author: xiaozhi
 * @create: 2020-05-03 23:17
 */
public class CourseImpl implements IcourseContent,IcourseManager{
    @Override
    public void getCourseName() {
        System.out.println("课程名称");
    }

    @Override
    public void getCourseVideo() {
        System.out.println("课程视频");
    }

    @Override
    public void studyCourse() {
            System.out.println("学习课程");
    }

    @Override
    public void backCourse() {
            System.out.println("退还课程");
    }
}

(4)、类图如下:说明IcourseContent接口和IcourseManager的职责是单一的 在这里插入图片描述3、示例3

  • 不使用针对方法的级别的单一职责 (1)、定义一个更新用户信息类,updateUserInfo方法既要更新用户名称,又要更新用户其他参数。
package com.rf.rules.singleResponsibility;

/**
 * @description: 更新用户信息类
 * @author: xiaozhi
 * @create: 2020-05-03 23:37
 */
public class UpdateUserInfo {
    public void updateUserInfo(String usernName,String... prams){
        //username 更新用户名称
        //prams    更新用户其他信息
    }
}

  • 使用针对方法的级别的单一职责

(1)、定义一个更新用户信息类,updateUserName方法只负责更新用户名称;updateUserAddress方法只负责更新用户地址;updateUserAge方法只负责更新用户年龄

package com.rf.rules.singleResponsibility;

/**
 * @description: 更新用户信息类
 * @author: xiaozhi
 * @create: 2020-05-03 23:37
 */
public class UpdateUserInfo {
  
    public void updateUserName(String userName){

    }
    public void updateUserAddress(String userAddress){

    }
    public void updateUserAge(String userAge){

    }
}

关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.0429s