zoukankan      html  css  js  c++  java
  • 七种设计原则

    设计模式七大原则

    1. 单一职责原则

      基本介绍

      对类来说,即一个类应该只负责一项职责,如类A负责两个不同职责:职责1,职责2,当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1,A2

      package com.sun.single;
      
      public class single1 {
          public static void main(String[] args) {
      
              System.out.println(vehicle+"使用单一原则之前");
              Vehicle vehicle = new Vehicle();
              vehicle.run("汽车");
              vehicle.run("飞机");
              vehicle.run("轮船");
          }
      }
      class Vehicle{
          public void run(String vehicle){
              System.out.println(vehicle+"在公路上跑");
          }
      }
      
      
      package com.sun.single;
      
      public class single2 {
          public static void main(String[] args) {
      
              Vehicle1 vehicle1 = new Vehicle1();
              vehicle1.run("汽车");
              Vehicle2 vehicle2 = new Vehicle2();
              vehicle2.runAri("飞机");
              Vehicle3 vehicle3 = new Vehicle3();
              vehicle3.runWater("轮船");
          }
      }
      class Vehicle1{
          public void run(String vehicle){
              System.out.println(vehicle+"在公路上跑");
          }
      }
      class Vehicle2{
          public void runAri(String vehicle){
              System.out.println(vehicle+"在天上跑");
          }
      }
      class Vehicle3{
          public void runWater(String vehicle){
              System.out.println(vehicle+"在水上跑");
          }
      }
      
      
      package com.sun.single;
      
      public class single3 {
          public static void main(String[] args) {
      
              System.out.println(vehicle+"使用单一原则之后");
              Vehicle4 vehicle4 = new Vehicle4();
              vehicle4.run("汽车");
              vehicle4.runAri("飞机");
              vehicle4.runWater("轮船");
              
          }
      }
      class Vehicle4{
          public void run(String vehicle){
              System.out.println(vehicle+"在公路上跑");
          }
          public void runAri(String vehicle){
              System.out.println(vehicle+"在天空上跑");
          }
          public void runWater(String vehicle){
              System.out.println(vehicle+"在水上跑");
          }
      }
      
      
    2. 接口隔离原则

      基本介绍

      客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上

      package com.sun.segregation;
      
      public class Segregation {
      
      }
      interface interface1{
          void operation1();
          void operation2();
          void operation3();
          void operation4();
          void operation5();
      }
      class B implements interface1{
      
          @Override
          public void operation1() {
      
              System.out.println("B实现了operation1");
          }
      
          @Override
          public void operation2() {
      
              System.out.println("B实现了operation2");
          }
      
          @Override
          public void operation3() {
      
              System.out.println("B实现了operation3");
          }
      
          @Override
          public void operation4() {
      
              System.out.println("B实现了operation4");
          }
      
          @Override
          public void operation5() {
      
              System.out.println("B实现了operation5");
          }
      }
      class D implements interface1{
      
          @Override
          public void operation1() {
      
              System.out.println("D实现了operation1");
          }
      
          @Override
          public void operation2() {
      
              System.out.println("D实现了operation2");
          }
      
          @Override
          public void operation3() {
      
              System.out.println("D实现了operation3");
          }
      
          @Override
          public void operation4() {
      
              System.out.println("D实现了operation4");
          }
      
          @Override
          public void operation5() {
      
              System.out.println("D实现了operation5");
          }
      }
      class A {
          public void depend1(interface1 i){
              i.operation1();
          }
          public void depend2(interface1 i){
              i.operation2();
          }
          public void depend3(interface1 i){
              i.operation3();
          }
      }
      class C {
          public void depend1(interface1 i){
              i.operation1();
          }
          public void depend4(interface1 i){
              i.operation4();
          }
          public void depend5(interface1 i){
              i.operation5();
          }
      }
      
      package com.sun.segregation.improve;
      
      public class Segregation1 {
          public static void main(String[] args) {
              A a = new A();
              a.depend1(new B());
              a.depend2(new B());
              a.depend3(new B());
              C c = new C();
              c.depend1(new D());
              c.depend4(new D());
              c.depend5(new D());
          }
      }
      interface interface1{
          void operation1();
      }
      interface interface2{
          void operation2();
          void operation3();
      }
      interface interface3{
          void operation4();
          void operation5();
      }
      class B implements interface1,interface2{
      
          @Override
          public void operation1() {
      
              System.out.println("B实现了operation1");
          }
      
          @Override
          public void operation2() {
      
              System.out.println("B实现了operation2");
          }
      
          @Override
          public void operation3() {
      
              System.out.println("B实现了operation3");
          }
      
      }
      class D implements interface1,interface3{
      
          @Override
          public void operation1() {
      
              System.out.println("D实现了operation1");
          }
          @Override
          public void operation4() {
      
              System.out.println("D实现了operation4");
          }
      
          @Override
          public void operation5() {
      
              System.out.println("D实现了operation5");
          }
      }
      class A {
          public void depend1(interface1 i){
              i.operation1();
          }
          public void depend2(interface2 i){
              i.operation2();
          }
          public void depend3(interface2 i){
              i.operation3();
          }
      }
      class C {
          public void depend1(interface1 i){
              i.operation1();
          }
          public void depend4(interface3 i){
              i.operation4();
          }
          public void depend5(interface3 i){
              i.operation5();
          }
      }
      
    3. 依赖倒转原则

      package com.sun.inversion;
      
      public class DependecyInversion {
          public static void main(String[] args) {
              Persion persion = new Persion();
              persion.receive(new Email());
          }
      }
      
      class Email{
          public String getInfo(){
              return "email:hello world";
          }
      }
      class Persion{
          public void receive(Email email){
              System.out.println(email.getInfo());
          }
      }
      
      package com.sun.inversion.improve;
      
      public class DependecyInversion {
          public static void main(String[] args) {
              Persion persion = new Persion();
              persion.receive(new Email());
              persion.receive(new WeiXin());
          }
      }
      interface IReceive{
          String getInfo();
      }
      class Email implements IReceive{
          public String getInfo(){
              return "email:hello world";
          }
      }
      class WeiXin implements IReceive{
      
          @Override
          public String getInfo() {
              return "WeiXin:hello world";
          }
      }
      
      class Persion{
          public void receive(IReceive receive){
              System.out.println(receive.getInfo());
          }
      }
      
    4. 里氏替换原则

      package com.sun.liskov;
      
      public class Liskov {
          public static void main(String[] args) {
      
              A a = new A();
              System.out.println("11-3="+a.func1(11,3));
              System.out.println("1-8="+a.func1(1,8));
              System.out.println("**************************");
              B b = new B();
              System.out.println("11-3="+b.func1(11,3));
              System.out.println("1-8="+b.func1(1,8));
              System.out.println("11+3+9="+b.func2(11,3));
          }
      }
      class A {
          public int func1(int num1,int num2){
              return num1 - num2;
          }
      }
      class B extends A {
          @Override
          public int func1(int a, int b) {
              return a+b;
          }
          public int func2(int a, int b) {
              return func1(a,b)+9;
          }
      }
      
      
      package com.sun.liskov.improve;
      
      public class Liskov {
          public static void main(String[] args) {
      
              A a = new A();
              System.out.println("11-3="+a.func1(11,3));
              System.out.println("1-8="+a.func1(1,8));
              System.out.println("**************************");
              B b = new B();
              System.out.println("11+3="+b.func1(11,3));
              System.out.println("1+8="+b.func1(1,8));
              System.out.println("11+3+9="+b.func2(11,3));
              System.out.println("11-3="+b.func3(11,3));
          }
      }
      
      class base{
      
      }
      class A extends base {
          public int func1(int num1,int num2){
              return num1 - num2;
          }
      }
      
      class B extends base {
          private A a = new A();
          public int func1(int a, int b) {
              return a+b;
          }
          public int func2(int a, int b) {
              return func1(a,b)+9;
          }
          public int func3(int a, int b){
              return this.a.func1(a,b);
          }
      }
      
      
    5. 开闭原则

      package com.sun.ocp;
      
      public class Ocp {
          public static void main(String[] args) {
              GraphicEditor graphicEditor = new GraphicEditor();
              graphicEditor.drawShape(new Rectangle());
              graphicEditor.drawShape(new Circle());
          }
      }
      class GraphicEditor {
          public void drawShape(Shape s) {
              if (s.m_type == 1)
                  drawRectangle(s);
              else if (s.m_type == 2)
                  drawCircle(s);
          }
          public void drawRectangle(Shape r) {
              System.out.println("矩形");
          }
          public void drawCircle(Shape r) {
              System.out.println("圆形");
          }
      }
      class Shape {
          int m_type;
      }
      class Rectangle extends Shape {
          Rectangle() {
              super.m_type = 1;
          }
      }
      class Circle extends Shape {
          Circle() {
              super.m_type = 2;
          }
      }
      
      package com.sun.ocp.improve;
      
      public class Ocp {
          public static void main(String[] args) {
              GraphicEditor graphicEditor = new GraphicEditor();
              graphicEditor.drawShape(new Rectangle());
              graphicEditor.drawShape(new Circle());
              graphicEditor.drawShape(new OtherGraphic());
          }
      }
      
      class GraphicEditor {
          public void drawShape(Shape s) {
              s.draw();
          }
      }
      
      abstract class Shape {
          int m_type;
          public abstract void draw();
      }
      
      class Rectangle extends Shape {
          Rectangle() {
              super.m_type = 1;
          }
      
          @Override
          public void draw() {
              System.out.println("绘制矩形");
          }
      }
      
      class Circle extends Shape {
          Circle() {
              super.m_type = 2;
          }
      
          @Override
          public void draw() {
              System.out.println("绘制圆形");
          }
      }
      class OtherGraphic extends Shape {
      
          OtherGraphic() {
              super.m_type = 4;
          }
          @Override
          public void draw() {
              System.out.println("绘制其他图形");
          }
      }
      
    6. 迪米特法则

      package com.sun.demeter;
      
      import java.util.ArrayList;
      import java.util.List;
      
      public class Demeter {
          public static void main(String[] args) {
              SchoolManager schoolManager = new SchoolManager();
              schoolManager.printAllEmployee(new CollegeManager());
          }
      }
      
      class Employee {
          private String id;
      
          public void setId(String id) {
              this.id = id;
          }
      
          public String getId() {
              return id;
          }
      }
      
      class CollegeEmployee {
          private String id;
      
          public void setId(String id) {
              this.id = id;
          }
      
          public String getId() {
              return id;
          }
      }
      
      class CollegeManager {
          public List<CollegeEmployee> getAllEmployee() {
              List<CollegeEmployee> list = new ArrayList<CollegeEmployee>();
              for (int i = 0; i < 10; i++) {
                  CollegeEmployee emp = new CollegeEmployee();
                  emp.setId("学院员工id:" + i);
                  list.add(emp);
              }
              return list;
          }
      }
      
      class SchoolManager {
          public List<Employee> getAllEmpoyee() {
              List<Employee> list = new ArrayList<Employee>();
              for (int i = 0; i < 5; i++) {
                  Employee emp = new Employee();
                  emp.setId("学校总部员工id:" + i);
                  list.add(emp);
              }
              return list;
          }
      
          void printAllEmployee(CollegeManager sub) {
              List<CollegeEmployee> list1 = sub.getAllEmployee();
              System.out.println("*******分公司员工**********");
              for (CollegeEmployee e : list1) {
                  System.out.println(e.getId());
              }
              List<Employee> list2 = this.getAllEmpoyee();
              System.out.println("*******学校总部员工*********");
              for (Employee e : list2) {
                  System.out.println(e.getId());
              }
          }
      
      }
      
      package com.sun.demeter.improve;
      
      import java.util.ArrayList;
      import java.util.List;
      
      public class Demeter {
          public static void main(String[] args) {
              SchoolManager schoolManager = new SchoolManager();
              schoolManager.printAllEmployee(new CollegeManager());
          }
      }
      
      class Employee {
          private String id;
      
          public void setId(String id) {
              this.id = id;
          }
      
          public String getId() {
              return id;
          }
      }
      
      class CollegeEmployee {
          private String id;
      
          public void setId(String id) {
              this.id = id;
          }
      
          public String getId() {
              return id;
          }
      }
      
      class CollegeManager {
          public List<CollegeEmployee> getAllEmployee() {
              List<CollegeEmployee> list = new ArrayList<CollegeEmployee>();
              for (int i = 0; i < 10; i++) {
                  CollegeEmployee emp = new CollegeEmployee();
                  emp.setId("学院员工id:" + i);
                  list.add(emp);
              }
              return list;
          }
          public void printEmployee() {
              List<CollegeEmployee> list1 = getAllEmployee();
              System.out.println("*******分公司员工**********");
              for (CollegeEmployee e : list1) {
                  System.out.println(e.getId());
              }
          }
      }
      
      class SchoolManager {
          public List<Employee> getAllEmpoyee() {
              List<Employee> list = new ArrayList<Employee>();
              for (int i = 0; i < 5; i++) {
                  Employee emp = new Employee();
                  emp.setId("学校总部员工id:" + i);
                  list.add(emp);
              }
              return list;
          }
      
          void printAllEmployee(CollegeManager sub) {
              sub.printEmployee();
              List<Employee> list2 = this.getAllEmpoyee();
              System.out.println("*******学校总部员工*********");
              for (Employee e : list2) {
                  System.out.println(e.getId());
              }
          }
      
      }
      
    7. 合成复用原则

      尽量使用合成/聚合的方式,而不是使用继承

  • 相关阅读:
    Docker 部署 Nginx
    Docker 安装 Redis
    linux shell "2>&1"
    定时备份docker mysql
    SpringBoot 中拦截器和过滤器的使用
    SpringBoot WebMvcConfigurer
    springboot自定义参数解析HandlerMethodArgumentResolver
    mysql在linux下查看my.cnf位置的方法
    Linux下设置mysql允许远程连接
    Android项目实战(六十):修改项目包名
  • 原文地址:https://www.cnblogs.com/striver20/p/13602013.html
Copyright © 2011-2022 走看看