栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java 6大设计原则28大设计模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 6大设计原则28大设计模式

6大设计原则: 1. 单一职责原则 单一职责原则的英文名称是 Single Responsibility Principle ,简称是SRP(There should never be more than one reason for a class to change.) 见名知意,充斥着满满的争议,需求的更替,版本的迭代,场景的复杂,种种都能导致这个被破坏,但是把出发点是好的,单一意味着简单,简单意味着易懂,而后易维护、节省人力、成本、增加稳定性;但是场景复杂时就类就多了,em...;仁者见仁智者见智,不展开讲了 2. 里氏替换原则 里氏替换原则( Liskov Substitution Principle, LSP ) 定义1: If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T,the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T. (如果对每一个类型为 S 的对象 o1 ,都有类型为 T 的对 象 o2 ,使得以 T 定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变 化,那么类型 S 是类型 T 的子类型。) 定义2: Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it. (所有引用基类的地方必须能透明地使用其子类的 对象。) 说的就是Java中父子关系(继承、实现),父类出现的地方,可替换成子类 原则上相当于制定了契约 正例不举了,我举个反例吧: 如果其他程序调用时,不能通过父类或者接口,而必须使用子类时,则说明类的设计已经违背了LSP原则;
public interface A {
    void method();
}

public class AImpl implements A {
    public void method() {
    }
    public void methodSub() {
    }
}

// 使用方

public class Test {
    public static void main(String[] args) {
        AImpl obj = new AImpl();
        // 外部调用时obj对象的类不能替换成A,则违反了LSP
        obj.methodSub();
    }
}

3. 依赖倒置原则 依赖倒置原则( Dependence Inversion Principle,DIP ) High level modules should not depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details.Details should depend upon abstractions.

模块间的依赖通过抽象发生(接口或抽象类) 接口或抽象类不依赖于实现类 实现类依赖接口或抽象类 简而言之就是解耦 4. 接口隔离原则

Interface Segregation Principle

Clients should not be forced to depend upon interfaces that they don't use. (客户端不应该依 赖它不需要的接口。) The dependency of one class to another one should depend on the smallest possible interface. (类间的依赖关系应该建立在最小的接口上。) 简而言之,用什么依赖什么 所以对接口就要求

接口职能单一,服务定制,设计有度 接口要高内聚,减少交互 5. 迪米特法则 迪米特法则(Law of Demeter,LoD)也称为最少知识原则(Least Knowledge Principle,LKP) 只通过接口协定交互,其他一概不管;only talk to your immediate friends(只与直接的朋友沟通。) 是自己的逻辑就是自己的逻辑,不是自己的就不是自己的 6. 开闭原则 Open Closed Principle Software entities like classes,modules and functions should be open for extension but closed for modifications. (一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。) 开闭原则个人粗浅的见解是一个法典,像一种理想化,一种指导方针;我们需要通过抽象约束、规范制度、需求预见等使程序在时间推移的过程中一直在做扩展和增强,减少已有的抽象的修改(例如接口制定了,以后都不用再修改,这个肯定是我们最希望的);我们需要朝这个方向去努力,拥抱变化的同时,越少打破这个原则


28大设计模式 1. 单例模式

最简单常用的模式,不展开了

public Sun {
    private static final Sun sun = new Sun();
    public static Sun getInstance() {
        return sun;
    }
    public void light() {
        System.out.println("太阳发光");
    }
}
2. 工厂方法模式 Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses. (定义一个用于创建对象的 接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。) 优点: 1.  良好的封装性,代码结构清晰 2. 良好的扩展性(横向扩展,例如例子中需要新增一种食物) 3. 解耦,散落到各处的类似的初始化逻辑可以被封装,不用重复写,也提高维护性 应用: 1. 可简化成 简单工厂模式 用静态方法代替工厂类 2. 升级成多工厂 3. 单例模式的替代品 4. 延迟初始化
public interface Food {
    void name();
}

public class Bread implements Food {
    @Override
    public void name() {
        System.out.println("我是面包");
    }
}

public class cookie implements Food {
    @Override
    public void name() {
        System.out.println("我是饼干");
    }
}

public class FoodFactory {
    public  T productFood(Class cls) {
        T t = null;
        try {
            t = cls.newInstance();
        } catch (Exception e) {
            System.out.println("我不会生产这个");
            e.printStackTrace();
        }
        return t;
    }
    public static void main(String[] args) {
        FoodFactory factory = new FoodFactory();
        Bread bread = factory.productFood(Bread.class);
        bread.name();
        cookie cookie = factory.productFood(cookie.class);
        cookie.name();
    }
}
3. 抽象工厂模式

Provide an interface for creating families of related or dependent objects without specifying their concrete classes.(为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们 的具体类。)

优点: 1. 抽象封装 2. 分类约束 缺陷: 1. 子工厂扩展受限

public interface Food {
    void name();
}

public class SweetBread implements Food {
    @Override
    public void name() {
        System.out.println("我是甜面包");
    }
}

public class SaltyBread implements Food {
    @Override
    public void name() {
        System.out.println("我是咸面包");
    }
}

public class cookie implements Food {
    @Override
    public void name() {
        System.out.println("我是饼干");
    }
}

public abstract class FoodFactory {
     T productFood(Class cls);
}

public class BreadFactory extends FoodFactory {
    public  T productFood(Class cls) {
        T t = null;
        try {
            t = cls.newInstance();
        } catch (Exception e) {
            System.out.println("我不会生产这个");
            e.printStackTrace();
        }
        return t;
    }
    public static void main(String[] args) {
        FoodFactory factory = new BreadFactory();
        SweetBread bread1 = factory.productFood(SweetBread.class);
        bread1.name();
        SaltyBread bread2 = factory.productFood(SaltyBread.class);
        cookie2.name();
    }
}
4. 模板方法模式

对于业务模型的业务动作模板化;基本方法在子类中实现,模板方法在父类中调度

优点: 1. 封装固定部分,扩展可变部分 2. 公共代码提取,统一行为控制 缺陷: 1. 行为流程固化(之前是抽象的是一个动作;现在是抽象了动作和动作的顺序) 2. 复杂场景新手阅读不适(串联逻辑时,一下到子类,一下到父类,绕晕)
public abstract class Car {
    public abstract void start();
    public abstract void drive();
    public abstract void stop();
    public void run() {
        start();
        drive();
        stop();
    }
}
public class HongQiCar extends Car {
    @Override
    public void start() {
        System.out.println("红旗车启动");
    }
    @Override
    public void drive() {
        System.out.println("红旗车行驶");
    }
    @Override
    public void stop() {
        System.out.println("红旗车停止");
    }
    public static void main(String[] args) {
        Car car = new HongQiCar();
        car.run();
    }
}
5. 建造者模式

今天先到这吧,后面再补

-- 有缘登山,寒山不寒

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/777463.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号