前置介绍
软件开发,不管是前端还是后端,不管你用的是springboot还是django,uniapp还是mpvue,哪怕是数据库连接平台redis、mabits、hibernate,都或多或少用了设计原则。
fafs
你说你不会,不合理呀。
接下来给大家介绍一下我练习后的感悟。 提示:代码注释比较有用哦。
单一职责原则
代码奉上:
package singleresponsbility;
/**
* @author yzq
* @projectName designdemo
* @packageName singleresponsbility :一个类只能有一种职责 =》一个方法只能有一个职责。
* @data 2020-09-06 09:
*/
public class SingleResponsibility1 {
public static void main(String[] args) {
Vehicle vehicle = new Vehicle();
vehicle.run("飞机");
vehicle.run("汽车");
}
}
/*违反了单一职责原则。
* 解决:
* 根据不同交通方法,分解成不同类
* */
class Vehicle{
public void run(String args) {
System.out.println(args+"在公路上运行");
}
}
改良一
package singleresponsbility;
/**
* @author yzq
* @projectName designdemo
* @packageName singleresponsbility
* @data 2020-09-06 09:
*/
public class SingleResponsibility2 {
public static void main(String[] args) {
Vehicle2 vehicle = new Vehicle2();
vehicle.run("汽车");
Aircle2 aircle2 = new Aircle2();
aircle2.run("飞机");
}
}
/*遵守单一职责原则,但是需要改动测试和执行类。
* 解决:
* 直接改动Vehicle类
* */
class Vehicle2{
public void run(String args) {
System.out.println(args+"在公路上运行");
}
}
class Aircle2{
public void run(String args) {
System.out.println(args+"在公路上运行");
}
}
改良二
package singleresponsbility;
/**
* @author yzq
* @projectName designdemo
* @packageName singleresponsbility
* @data 2020-09-06 09:
*/
public class SingleResponsibility3 {
public static void main(String[] args) {
Vehicle3 vehicle = new Vehicle3();
vehicle.airRun("飞机");
vehicle.run("汽车");
}
}
/*在类上没有遵守单一职责原则,但是在方法上遵守单一职责原则
* 优点:
* 改变代码不大,对增加开发,对修改关闭
* */
class Vehicle3{
public void run(String args) {
System.out.println(args+"在公路上运行");
}
public void airRun(String args) {
System.out.println(args+"在天空运行");
}
public void waterRun(String args) {
System.out.println(args+"在水中运行");
}
}
开闭原则
package opencloseeprinciple;
/**
* @author yzq
* @projectName designdemo
* @packageName opencloseeprinciple
* @described 对拓展开放,对修改关闭 =>将共有方法抽象出接口。
* @data 2020-09-06 14:07
*/
public class OpenClosed1 {
public static void main(String[] args) {
Shape1 circle = new Circle();
Shape1 rectangle = new Rectangle();
new GraphicCreate().drawShape(circle);
new GraphicCreate().drawShape(rectangle);
//添加新的shape对象不改变其他实现类
}
}
class GraphicCreate{
public void drawShape(Shape1 s){
s.drawShape();
}
}
interface Shape1{
public void drawShape();
}
class Circle implements Shape1{
public void drawShape(){
System.out.println("画圆");
}
}
class Rectangle implements Shape1{
public void drawShape(){
System.out.println("画矩");
}
}
里氏置换原则
package liskovsubstitution;
/**
* @author yzq
* @projectName designdemo
* @packageName liskovsubstitution:
* @describe(子类不要随意修改父类;继承造成程序有侵入性,可移植性降低,尤其不能修改父类。)
* @describe =》所有引用父子类的都使用相同的基类对象,适当用聚合、组合、依赖解决问题;子类不要重写父类方法。
* @data 2020-09-06 13:
*/
public class Substitution {
public static void main(String[] args) {
Sus sus = new Sus();
System.out.println(sus.add(2,3));
}
}
//采用聚合等方式避免重写
class Add {
public int add(int a,int b)
{
return a+b;
}
}
class Sus{
private Add a = new Add();
//不继承不会重写A
public int add(int a,int b){
//使用组合完成功能实现
return this.a.add(a,b);
}
}
接口隔离原则
package interfacesegregation;
/**
* @author yzq
* @projectName designdemo
* @packageName interfacesegregation 一个雷对另一个类的依赖建立在最小的程度上
* @data 2020-09-06 10:
*/
public class segregation {
public static void main(String[] args) {
A a = new A();
a.operation1();
a.operation4();
C c = new C();
c.operation2();
c.operation3();
}
}
//接口1
interface Interface1{
void operation1();
}
//接口2
interface Interface2{
void operation2();
void operation3();
}
//接口3
interface Interface3{
void operation4();
void operation5();
}
class B implements Interface1,Interface3{
@Override
public void operation1() {
System.out.println("B实现1");
}
@Override
public void operation4() {
System.out.println("B实现4");
}
@Override
public void operation5() {
System.out.println("B实现50");
}
}
class C implements Interface2,Interface1{
@Override
public void operation1() {
System.out.println("C 实现 1");
}
@Override
public void operation2() {
System.out.println("C 实现 2");
}
@Override
public void operation3() {
System.out.println("C 实现 3");
}
}
class A extends B{//如果AB功能是相同的使用这种方式比较少代码
}
依赖倒置原则
package dependenceinversion;
/**
* @author yzq
* @projectName designdemo
* @packageName dependenceinversion: 细节依赖抽象;具体类实现抽象;高层与底层??橐览党橄?;中心思想=》依赖接口编程。
* @data 2020-09-06 11:
*/
public class Inversion1 {
public static void main(String[] args) {
/*该方式只能接受邮箱信息,不能接受其他类比如微信、qq信息
* 优化:
* 对接受信息抽象储接口
* */
Persion1 persion = new Persion1();
Email1 email1 = new Email1();
persion.receive(email1);
}
}
class Email1{
public String getInfo(){
return "电子邮件信息";
}
}
class Persion1{
public void receive(Email1 email1){
System.out.println("接收到:"+email1.getInfo());
}
}
改良一
package dependenceinversion;
/**
* @author yzq
* @projectName designdemo
* @packageName dependenceinversion: 细节依赖抽象;具体类实现抽象;高层与底层模块依赖抽象;中心思想=》依赖接口编程。
* @data 2020-09-06 11:
*/
public class Inversion2 {
public static void main(String[] args) {
/*该方式能接受邮箱信息及其他类比如微信、qq信息
* 优点:
* 对信息进行抽象实现任意组装
* */
//接口方式
Persion2 persion = new Persion2();
EInfo email1 = new Email2();
EInfo wchat = new Wechat();
persion.receive(email1);
persion.receive(wchat);
//构造方法方式
EInfo3 info3 = new Email3();
Persion3 persion3 = new Persion3(info3);
persion3.receive();
//set方式
EInfo4 info4 = new Wechat4();
Persion4 persion4 = new Persion4();
persion4.setInfo(info4);
persion4.receive();
}
}
//抽象接口方式
class Email2 implements EInfo{
public String getInfo(){
return "电子邮件信息";
}
}
class Wechat implements EInfo{
public String getInfo(){
return "微信信息";
}
}
interface EInfo{
String getInfo();
}
class Persion2{
public void receive(EInfo info){
System.out.println("接收到:"+info.getInfo());
}
}
//构造方法方式
class Email3 implements EInfo3{
public String getInfo(){
return "电子邮件信息";
}
}
class Wechat3 implements EInfo3{
public String getInfo(){
return "微信信息";
}
}
interface EInfo3{
String getInfo();
}
class Persion3{
private EInfo3 info;
public Persion3(EInfo3 info){
this.info =info;
}
public void receive(){
System.out.println("接受到:"+this.info.getInfo());
}
}
//set方式
class Email4 implements EInfo4{
public String getInfo(){
return "电子邮件信息";
}
}
class Wechat4 implements EInfo4{
public String getInfo(){
return "微信信息";
}
}
interface EInfo4{
String getInfo();
}
class Persion4{
private EInfo4 info;
public void setInfo(EInfo4 info) {
this.info = info;
}
public void receive(){
System.out.println("接受到:"+this.info.getInfo());
}
}
迪米特法则
package demeterprinciple;
import java.util.ArrayList;
import java.util.List;
/**
* @author yzq
* @projectName designdemo
* @packageName demeterprinciple
* @describe 对象之间应保持最少了解,即减少耦合=》只与有耦合的对象通信,陌生的类不要以局部变量出现(成员变量,方法参数,方法返回值),耦合方式:依赖(弱关联,局域变量,方法形参)、关联(成员变量)、组合(has a)、聚合(强关联)、
* @data 2020-09-06 14:
*/
public class demeter1 {
public static void main(String[] args) {
Depatrment allDep = new AllDep();
Depatrment schDep = new SchDep();
School school = new School();
school.setDepatrment(allDep);
school.setDepatrment(schDep);
school.findDep();
}
}
class School{
private List<Depatrment> depatrment = new ArrayList<Depatrment>();
public void setDepatrment(Depatrment depatrment) {
this.depatrment.add(depatrment);
}
public void findDep(){
for (Depatrment de :this.depatrment){
de.getID();
}
}
}
interface Depatrment{
public void getID();
}
class AllDep implements Depatrment{
@Override
public void getID() {
System.out.println("总部ID");
}
}
class SchDep implements Depatrment{
@Override
public void getID() {
System.out.println("学院ID");
}
}
合成复用原则
package compositereuse;
/**
* @author yzq
* @projectName designdemo
* @packageName compositereuse
* @describe 尽量使用合成/聚成,不使用继承
* @data 2020-09-06 16:05
*/
public class Reuse1 {
}
总结
设计模式怎么搞更好:
- 类独立出变化项,作为依赖,不要继承;
- 面向接口;
- 低耦合