首页 > 其他分享 >设计模式的六大原则

设计模式的六大原则

时间:2024-07-02 09:09:35浏览次数:9  
标签:六大 Console Student 原则 void class WriteLine 设计模式 public

1、依赖倒置原则

/// <summary>
/// 高层模块不应该依赖底层模块
/// 二者都应该依赖其抽象
/// </summary>
public class Student
{
    public int Age { get; set; }
    public string Name { get; set; }
    public double Scores { get; set; }

    public void GetAge()
    {
        Age = 18;
        Console.WriteLine(Age);
    }

    /// <summary>
    /// 假如要增加一个GetName方法,你在原有的类上增加,
    /// 你这个看起来简单,你觉得自己能hold住,实际上,牵一发而动全身
    /// 真正已经运行的程序,你添加新的功能可能会出问题
    /// </summary>
    public void GetName()
    {
        Name = "张三";
        Console.WriteLine(Name);
    }
}

/// <summary>
/// 最好的解决方案就是增加一个接口
/// </summary>
public interface IStudent
{
    void GetName();
}

public class StudentExtend : IStudent
{
    public int Age { get; set; }
    public string Name { get; set; }
    public double Scores { get; set; }

    public void GetAge()
    {
        Age = 18;
        Console.WriteLine(Age);
    }

    public void GetName()
    {
        Name = "张三";
        Console.WriteLine(Name);
    }
}

依赖倒置原则:依赖倒置原则是SOLID设计原则中的"D",它建议代码应该依赖于抽象(接口或抽象类),而不是具体的实现。这样做可以降低模块间的耦合度,提高代码的灵活性和可扩展性。

原始 Student 类:在原始的 Student 类中,GetAge 和 GetName 方法是直接在这个类中实现的。如果这个类已经被许多客户端代码使用,那么在未来对它的任何更改都可能影响到这些客户端。

添加接口 IStudent:通过定义一个接口 IStudent 并包含 GetName 方法,您创建了一个抽象层。这个接口可以被不同的类实现,而不影响现有的客户端代码。

扩展 StudentExtend 类:StudentExtend 类实现了 IStudent 接口,这意味着它提供了接口中定义的方法的具体实现。这样,如果未来需要添加更多方法,您可以在不修改原始 Student 类的情况下进行。

解耦和灵活性:使用接口作为中介,StudentExtend 类的实现与使用它的客户端代码解耦。客户端代码只需要知道 IStudent 接口,而不需要知道具体的实现类。这使得更换或扩展实现变得更加容易。

开闭原则:通过依赖接口,您的设计遵循了开闭原则,即软件实体应对扩展开放,对修改封闭。这意味着您可以在不改变现有代码的基础上增加新功能。

实际应用:在实际的应用程序中,如果需要对 Student 类添加新的行为,您可以通过定义新的接口和实现这些接口的类来扩展功能,而不影响现有的使用 Student 类的代码。
2、接口隔离原则

/// <summary>
/// 接口隔离原则有点像单一职责,但是还是要防止封装过度
/// </summary>
public interface IPhone
{
    void GetNumber();// 获取电话号码
    void SendContent();//发送短信
    void Call(); //打电话
    void PlayGame();//打游戏
}

public class Phone : IPhone
{
    public void GetNumber()
    {
        Console.WriteLine("获取电话号码");
    }

    public void SendContent()
    {
        Console.WriteLine("发送短信");
    }

    public void Call()
    {
        Console.WriteLine("打电话");
    }

    public void PlayGame()
    {
        Console.WriteLine("打游戏");
    }
}

/// <summary>
/// 如果只有一部需要打电话、发送短信的老年机,毕竟老年人不玩游戏,这个时候,接口应该隔离
/// </summary>
public interface IPhoneExtend1
{
    void SendContent();//发送短信
    void Call(); //打电话
}
public interface IPhoneExtend2
{
    void GetNumber();// 获取电话号码
    void PlayGame();//打游戏
}

/// <summary>
/// 老年手机
/// </summary>
public class Phone1 : IPhoneExtend1
{
    public void SendContent()
    {
        Console.WriteLine("发送短信");
    }

    public void Call()
    {
        Console.WriteLine("打电话");
    }
}

/// <summary>
/// 学生手机
/// </summary>
public class Phone2 : IPhoneExtend1,IPhoneExtend2
{
    public void GetNumber()
    {
        Console.WriteLine("获取电话号码");
    }

    public void SendContent()
    {
        Console.WriteLine("发送短信");
    }

    public void Call()
    {
        Console.WriteLine("打电话");
    }

    public void PlayGame()
    {
        Console.WriteLine("打游戏");
    }
}

3、迪米特原则

/// <summary>
/// 迪米特原则,最少知道原则
/// 团队的组长知道项目进度
/// 老板也要知道项目进度
/// 项目进度组长直接告诉老板就行
/// 所以正确的写法应当是项目进度的类暴露给团队组长
/// 再由团队组长告知老板,项目进度这个类不需要出现在老板的类中
/// </summary>
public class Sample {
    public static void GetProcess() {
        Boss boss = new Boss();
        TeamLeader teamLeader = new TeamLeader();
        boss.CommandTeamLeader(teamLeader);
    }
}

public class Boss{
    public void CommandTeamLeader(TeamLeader teamLeader) {
//	    teamLeader.sayProccess(new Program());
        teamLeader.SayProccess();
    }
}

public class TeamLeader{
    //void sayProccess(Program program) {
    //    program.getProccess();
    //}
    public void SayProccess() {
        new Program().GetProccess();
    }
}

public class Program{

    public void GetProccess() {
        Console.WriteLine("当前的项目进度为  50%");
    }
}

4、里氏替换原则

/// <summary>
/// 1、现在学生类只有一个方法,获取学生成绩
/// 2、现在进行扩展,添加一个功能,
/// 3、我们只需要获取理科成绩
/// </summary>
public class Student
{
    public int Age { get; set; }
    public string Name { get; set; }
    public double Scores { get; set; }

    /// <summary>
    /// 获取学生成绩
    /// </summary>
    /// <returns></returns>
    public double GetScores()
    {
        return Scores;
    }

    //获取理科成绩
    public double GetScienceScore()
    {
        return Scores;
    }
}

/// <summary>
/// 现在扩展一个功能,由子类完成
/// 这个功能在原来的GetScores上添加
/// 那么,这个扩展的方法可能导致原有的方法发生故障
/// 解决方法,尽量不要重载、重写父类方法
/// </summary>
public class StudentExtend : Student
{
    public double NewScores()
    {
        return default;
    }
}

/// <summary>
/// 理科
/// </summary>
public class ScienceStudent : Student
{
    public double GetScienceScore()
    {
        return Scores;
    }
}

/// <summary>
/// 文科
/// </summary>
public class VincoStudent : Student
{
    public double GetVincoScore()
    {
        return Scores;
    }
}

5、开闭原则

public interface IStudent
{
    void GetStudent();
    
}

public class Student:IStudent
{
    public void GetStudent()
    {
         
    }
}

///简单来说就是对扩展开放,对修改关闭
IStudent stu=new Student();
stu.GetStudent();

//你可以重新写一个类去实现IStudent,而不要去修改IStudent和Student

6、单一职责原则

/// <summary>
/// 一个类只负责一项职责,就一个类而言,只有一个引起它变化的原因
/// </summary>
public class Sample
{
    /// <summary>
    /// 简单来说就是各司其职
    /// 不要让一个类有太多的功能
    /// 多写一个抽象类分离出去
    /// 使用继承去分门别类
    /// </summary>
    public class Student
    {
        public int Age { get; set; }
        public string Name { get; set; }
        public double Scores { get; set; }
        public Student()
        {
            
        }

        /// <summary>
        /// 获取学生成绩
        /// </summary>
        /// <returns></returns>
        public double GetScores()
        {
            return Scores;
        }
    }
    
}

标签:六大,Console,Student,原则,void,class,WriteLine,设计模式,public
From: https://www.cnblogs.com/guchen33/p/18279219

相关文章

  • 小红书涨粉 | 全面提升粉丝数量的六大法宝
    前言......
  • 设计模式——开闭、单一职责及里氏替换原则
    设计原则是指导软件设计和开发的一系列原则,它们帮助开发者创建出易于维护、扩展和理解的代码。以下是你提到的几个关键设计原则的简要说明:开闭原则(Open/ClosedPrinciple,OCP):开闭原则由BertrandMeyer提出,强调软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。这意味......
  • 【超简单-Java设计模式2】简单工厂模式
    简单工厂设计模式:概念、Java实现与应用剖析简单工厂模式,作为设计模式中最直观、易懂的一种,被广泛应用于软件开发中,尤其在需要创建一系列相关或相互依赖对象的场景下。本文将深入探讨简单工厂模式的概念,通过Java代码示例展示其实现,并分析其在实际开发中的使用场景与优缺点。......
  • Java 说一下你熟悉的设计模式?
    在Java开发中,设计模式是常用的解决方案,用于解决软件设计中的常见问题。以下是一些常用的设计模式:创建型模式(CreationalPatterns)单例模式(SingletonPattern):确保一个类只有一个实例,并提供一个全局访问点。示例:publicclassSingleton{privatestaticSingletoni......
  • 【JavaScript脚本宇宙】精通前端开发:六大热门CSS框架详解
    前端开发的利器:深入了解六大CSS框架前言在现代Web开发中,选择适合的前端框架和工具包是构建高效、响应式和美观的网站或应用程序的关键。本文将详细介绍六个广受欢迎的CSS框架:Bootstrap、Bulma、TailwindCSS、Foundation、Materialize和SemanticUI。每个框架都有其独特的......
  • 设计模式II
    建造者模式在建造者模式中,通常会定义以下接口/抽象类:抽象建造者接口(Builder):定义了构建产品各个部分的抽象方法,通常包括创建产品和设置产品各个部分的方法。具体建造者类将实现这个接口来构建产品的各个部分。产品接口(Product):定义了产品的抽象接口,通常包括产品的属性和行为。具......
  • 结构型设计模式
    适配器模式需求方法M1。但已经存在一个方法M2能实现需求功能,引入子类来覆盖M1方法(M1方法中调用已有的M2方法)。这个新子类就是适配器将已有的方法转换为需求的另一种方法(一般由于方法名差异;参数不同)这一模式中的“接口”是广义接口,可代指一个/一组方法集合优点:无需修改已有内容......
  • 设计模式-观察者模式
    观察者模式观察者模式(ObserverPattern),又叫发布-订阅(Publisher/Subscribe)模式,模型-视图模式,源-监听器模式或从属者模式。定义一种一对多的依赖关系,一个主题对象可以同时被多个监听者同时监听,使得每当主题对象状态发生变化时,所有依赖于它的对象都会得到通知并被自动更新。属于行为......
  • [最全]设计模式实战(总序)
    最近一段时间,读完了《Android源码设计模式-解析与实战》和《大话设计模式》这两本经典设计模式相关书籍,撰写相关笔记。每种设计模式将从以下方式聊聊:1.是什么(What,即定义);解决什么问题(Why,即使用场景)2.如何使用(How,即最简UML图+Java代码)3.生活场景举例(贴近生活,更易理解)4.......
  • C++中的八大设计原则
    目录摘要C+中的8大设计原则1.单一职责原则(SingleResponsibilityPrinciple,SRP)2.开放封闭原则(Open/ClosedPrinciple,OCP)3.里氏替换原则(LiskovSubstitutionPrinciple,LSP)4.依赖倒置原则(DependencyInversionPrinciple,DIP)5.接口隔离原则(Inte......