23张图+10个代码块跟着故事读懂设计模式6大原则

3,794 阅读3分钟

学好武功,心法是多么的重要。像是那些练错心法的,比如欧阳锋大叔,心法错了,走火入魔了,死在华山之巅。还有些必先自宫的武功,没准后面一页就说上一页是不需要的。所以6大原则,大家也把心法吃透,才能练好武功啊。

首先看下设计模式6大原则的概览。

  • 1、开闭原则 | 对扩展开放,对修改关闭。

  • 2、里氏代换原则 | 子类都可以做到代替基类的出现。

  • 3、依赖倒转原则 | 针对接口编程,依赖于抽象而非具体。

  • 4、接口隔离原则 | 使用多个隔离的接口,比使用单个接口要好。(降低类之间的耦合度)

  • 5、迪米特法则(最少知道原则)| 一个实体应当尽量少地与其他实体之间发生相互作用。

  • 6、单一职责 | 一个类应该只有一个引起它变化的原因,一个职责。

当然这么看还是太抽象了,下面会分4天(4篇)小漫画+代码的形式详细来讲解~

第一天

上次链接:设计模式开篇

public class Animal {
   public void eat() {
       System.out.println("eat something");
   }
   public void sleep() {
       System.out.println("sleeping ~~");
   }
}
public void eat (String kind) {
    if (kind.equals("rabbit")) {
        System.out.println("eat some carmine");
    }
    if (kind.equals("tigger")) {
        System.out.println("eat some meat");
    }
}
public class Rabbit extends Animal {
   public void eat() {
       System.out.println("eat some carmine");  
   }
}
public class Cooker {
   public void cook(Potato potato) {
       System.out.println("开始做菜了");
       System.out.println(potato.getFood());
   }
}

class Potato {
   public String getFood() {
       return "酸辣土豆丝";
   }
}
public interface FoodMaterial {
   String getFood();
}

class Potato implements FoodMaterial{
   @Override
   public String getFood() {
       return "酸辣土豆丝";
   }
}

class Chicken implements FoodMaterial{
   @Override
   public String getFood() {
       return "可乐鸡翅";
   }
}

public class Cooker {

   public void cook(FoodMaterial foodMaterial) {
       System.out.println("开始做菜了");
       System.out.println(foodMaterial.getFood());
   }
   public static void main (String []args) {
       Cooker cooker = new Cooker();
       cooker.cook(new Potato());
   }
}

第二天

public interface EmployService {

   void sign (); //打卡
   void knockCode();//敲代码
   void recruit(); //招聘
   void relationShip(); //员工关系
   void performanceEvaluation(); //绩效管理
   void procedureDesign(); //程序设计
   void makeBugs(); //哈哈哈

}

public class HrServiceImpl implements EmployService{
   @Override
   public void sign() {
       System.out.println("打卡");     
   }
   @Override
   public void knockCode() {

   }
   @Override
   public void recruit() {
     System.out.println("招聘");       
   }
   @Override
   public void relationShip() {
     System.out.println("员工关系");       
   }
   @Override
   public void performanceEvaluation() {
     System.out.println("绩效考核");
   }
   @Override
   public void procedureDesign() {

   }
   @Override
   public void makeBugs() {

   }
}

public class ProgrammerServiceImpl implements EmployService {

   @Override
   public void sign() {
       System.out.println("打卡");
   }
   @Override
   public void knockCode() {
       System.out.println("敲代码");
   }
   @Override
   public void recruit() {

   }
   @Override
   public void relationShip() {

   }
   @Override
   public void performanceEvaluation() {

   }
   @Override
   public void procedureDesign() {
       System.out.println("程序设计");
   }
   @Override
   public void makeBugs() {
       System.out.println("造点bug");
   }
}

public class ProgrammerClient {

   public void sign (EmployService employService) {
       employService.sign();
   }

   public void knockCode(EmployService employService) {
       employService.knockCode();
   }

   public void procedureDesign(EmployService employService) {
       employService.procedureDesign();
   }

   public void makeBugs(EmployService employService) {
       employService.makeBugs();
   }
}


public class HrClient {

   public void sign (EmployService employService) {
       employService.sign();
   }

   public void performanceEvaluation(EmployService employService) {
       employService.performanceEvaluation();
   }

   public void recruit(EmployService employService) {
       employService.recruit();
   }

   public void relationShip(EmployService employService) {
       employService.relationShip();
   }
}
public interface EmployService {
   void sign(); //打卡
}

public interface HrService {
   void recruit(); //招聘
   void relationShip(); //员工关系
   void performanceEvaluation(); //绩效管理
}

public class HrServiceImpl implements HrService,EmployService{
   @Override
   public void sign() {
       System.out.println("打卡");
   }
   @Override
   public void recruit() {
       System.out.println("招聘");
   }
   @Override
   public void relationShip() {
       System.out.println("员工关系");
   }
   @Override
   public void performanceEvaluation() {
       System.out.println("绩效管理");
   }
}


public interface ProgrammerService {
   void knockCode();//敲代码
   void procedureDesign(); //程序设计
   void makeBugs(); //哈哈哈
}

public class ProgrammerServiceImpl implements ProgrammerService,EmployService {
   @Override
   public void sign() {
       System.out.println("签到");
   }
   @Override
   public void knockCode() {
       System.out.println("敲代码");
   }
   @Override
   public void procedureDesign() {
       System.out.println("程序设计");
   }
   @Override
   public void makeBugs() {
       System.out.println("造点bug");
   }
}

第三天

public interface CarService{
   String getName ();
   void drive ();
   String color();
}

public class Sedan implements CarService {
   private String name;
   private String color;
   private int speed;

   public Sedan(String name, String color,int speed{
       this.name = name;
       this.color = color;
       this.speed = speed;
   }

   @Override
   public String getName() {
       return this.name;
   }

   @Override
   public void drive() {
       System.out.println("普通的小车普通的开" + this.speed);
   }

   @Override
   public String color() {
       return this.color;
   }
}
public class FastSedan extends Sedan {
   public FastSedan(String name, String color, int speed) {
       super(name, color, speed);
   }

   public void drive() {
       System.out.println("飙车的飙,飙起来" + this.getSpeed() * 2);
   }
}
public class Boss {
   //发布任务给cto
   public void pushJob(CTO cto) {
       List<Programmer> list = new ArrayList<Programmer>();
       for (int i = 0;i < 5;i++) {
           list.add(new Programmer());
       }
       cto.assignmentTask(list);
   }
}

public class CTO {
   //分配任务
   public void assignmentTask(List<Programmer> programmers) {
       for (Programmer programmer:programmers) {
           programmer.backPot();
       }
   }
}

public class Programmer {
   //背锅
   public void backPot () {
       System.out.println("程序员背起了小锅");
   }
}

public class Client {
   public static void main (String []args) {
       Boss boss = new Boss();
       boss.pushJob(new CTO());
   }
}

最后一天

我们来巩固一下

公众号「Java小咖秀」,专注Java领域 , 和小伙伴们一起学习进步~

本文使用 mdnice 排版