[转]使用接口有什么好处?

本文通过一个购书系统的打折实例,详细介绍了面向接口编程的概念及优势。包括如何利用接口实现业务逻辑的解耦,提高代码的复用性和灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面象对象的基本原则就是针对抽象编程,而不是针对实现编程,为了取得更大的灵活性.     而java,C#等面向对象语言支持抽象的机制为   抽象类和接口,接口拥有更大的灵活性.     我举一个小例子,不太完善,希望能给你一些启发.     比如我们要做一个购书系统,购书后,需要进行打折,我们就来实现打折这一部分:         using   System;         namespace   InterfaceSample     {     //   表示一本书     class   Book     {                         //   书名                         public   string   Name;         //   价格         public   decimal   Money;     }             //书价打折接口(接口就像一个协议,你不用知道协议后面是什么,只需要知道它遵守了这个协   议),在这里,我们只知道这个接口会进行 打折计算     interface   IBookMoneyComputer     {         //计算书价         ///   <param   name="books">要计算价格的书目</param>         ///   <param   name="totalMoney">书的总价格(打折前的)</param>                         decimal   Compute(Book[]   books,   decimal   totalMoney);                     }                         //我们来实现两个打折器(构造两个类来实现IBookMoneyComputer接口)------------------     //   总价打折器,只要书总价超过500,   我们就给它减去100     class   TotalMoneyComputer   :   IBookMoneyComputer     {         public   decimal   Compute(Book[]   books,   decimal   totalMoney)         {           if   (totalMoney   >   500)                         return   totalMoney   -   100;           return   totalMoney;         }     }         //   书类别打折器,只要有一本书名为"DotNet",我们就给总价减去50     class   BookTypeComputer   :   IBookMoneyComputer     {         public   decimal   Compute(Book[]   books,   decimal   totalMoney)         {             foreach   (Book   book   in   books)             {     if   (book.Name   ==   "DotNet")     return   totalMoney   -   50;             }               return   totalMoney;         }     }         //----------------------------------------------------------------                     class   Class1                 {         //   静态方法,接受一个book数组,和一个打折器,注意,我们这个参数是接口类型     static   decimal   ComputeMoney(Book[]   books,   IBookMoneyComputer   computer)     {         //注意,这里的计算打折前的总价程序不需要进行抽象         decimal   totalMoney   =   0m;         foreach   (Book   book   in   books)         {               totalMoney   +=   book.Money;         }         //用接口类型进行打折,这样有很大的灵活性,可以随时更改打折策略         return   computer.Compute(books,   totalMoney);     }         ///   应用程序的主入口点。     [STAThread]     static   void   Main(string[]   args)     {         //我们来购造三本书         Book   book1   =   new   Book();         book1.Name   =   "aaa";         book1.Money   =   200;             Book   book2   =   new   Book();         book2.Name   =   "bbb";         book2.Money   =   400;             Book   book3   =   new   Book();         book3.Name   =   "DotNet";         book3.Money   =   200;         //可以分别运行两种打折策略来进行打折     Console.WriteLine(ComputeMoney(new   Book[]   {   book1,   book2,   book3   },   new   TotalMoneyComputer()));         Console.WriteLine(ComputeMoney(new   Book[]   {   book1,   book2,   book3   },   new   BookTypeComputer()));     Console.Read();     }             }     }

 

----------------------------

给不是你设计得程序调用。 ----------------------------

比如一个方法里面有读数据库的需要,传入参数为IDataReader接口         实际调用时,可以传入SqlDataReader对象,也可以传入OracleDataReader对象     数据库由SQLserver变为Oracle,此方法不需要作任何修改

------------------------------------------------

如果直接在类中硬编码ConvertToInt   则对其产生依赖         假定ConvertToInt()是复杂业务逻辑经常可变         实现了该接口的类在定义   ConvertToInt时   与实际调用不发生耦合         ItoInt   ii   =   new   ItoIntImplOne();     ii.ConvertToInt();     与     ItoInt   ii   =   new   ItoIntImplTwo();     ii.ConvertToInt();         区别在于你接口变量   指向了哪个引用         再结合控制反转容器   则变为         ItoInt   ii   =   AppContext.getBean("ItoIntImpl");         ii.ConvertToInt();         就将可能产生的变化不通过hardcode的形式写在程序里而放在配置文件中      光为了用而用接口是没有意义的,有良好的程序层次划分才能享受到面向接口编程带来的好处咯    ----------------------------------------------------------------     接口就好比电源插头,只要你支持这个接口,就是你有这个的电源插头,你就可以插到任何插排上,而不管你这个东西是电视、冰箱、还是电脑,都可以用。

--------------------------------------------------------

代码规范化,不会出现一样的功能有几种命名,还有就是间接地实现了多继承

---------------------------------------------------------------

一般情况下接口是应该和其相关类分开在不同的应用程序域中保证用户只是在使用自定义类的一个代理,很好的保证了代码的封装性,另外接口是可以多重继承的

--------------------------------------------

接口是对业务逻辑的抽象,类是业务规则的一种实现,是具体化。一个类可以实现多种业务规则,也就是多个接口。将接口和类分离,是为了适应业务的变化

------------------------------------------

个人认为接口的好处就是   便于重用         其实有些东西或许并没有你想象的那么复杂,现实生活中接口的例子也很多,例如插座,不管是电视机,还是冰箱,微波炉的插头都是可以插上去的,因为插头的规格是统一的(也就是接口),家电只要遵循插头的规格,就可以接到插座上去   ------------------------------------------

接口在重用,便利,规范,多态等方便都有很好的用处,但这要有经验才会体会的深刻...         除非了这些,我举一个具体的:     现在的软件不是一个人完成的,大家都知道     所以程序员中就有软件架构师,软件工程师,普通程序员等(随便分一下类的)     总之,有层次...     那么,软件架构师,软件工程师等就会设计软件的整个架构和(或)类设计等等     这样,只要定义接口,扔给下面的人去做具体的实现就可以了...      -------------------------------------

转载于:https://www.cnblogs.com/gates/p/3785515.html

<think>好的,用户问我关于VLAN子接口创建的意义。首先,我需要回忆一下VLAN的基本概念。VLAN是虚拟局域网,用来把一个物理网络划分成多个逻辑上的独立网络。子接口可能是在一个物理接口下创建多个虚拟接口,每个对应不同的VLAN。 接下来,用户可能已经了解桥接和链路聚合的区别,现在向VLAN子接口,可能是想进一步理解网络细分的技术。我需要明确VLAN子接口的作用,比如解决多VLAN的问题,或者在单物理接口上实现多逻辑连接。 然后,我应该考虑用户可能的背景。他们可能是网络管理员,或者在学习网络工程的学生。需要解释清楚技术细节,但避免过于晦涩。比如,VLAN子接口如何帮助隔离流量,或者与单臂路由的关系。 用户可能想知道为什么需要创建子接口而不是使用多个物理接口。这时候需要说明节省硬件资源的好处,以及灵活配置的优势。另外,可能涉及应用场景,比如不同部门需要网络隔离,但物理端口有限。 还要注意技术细节的正确性,比如子接口通常是在三层设备上配置,处理不同VLAN的路由。同时,可能需要提到IEEE 802.1Q标准,说明VLAN标签的作用,以及子接口如何处理这些标签。 另外,用户可能想知道实际应用中的例子,比如单臂路由配置,或者企业网络中的多租户环境。需要举例子来帮助理解,比如一个路由器通过一个物理接口连接多个VLAN,每个子接口处理不同VLAN的流量。 还要检查是否有其他相关概念需要区分,比如普通VLAN接口和子接口的区别。子接口是逻辑上的,可以更灵活地分配和管理,而物理接口是固定的。 最后,总结VLAN子接口的意义,比如提高资源利用率,增强网络灵活性,支持复杂网络结构,以及如何促进网络扩展和管理。确保回答结构清晰,逐步展开,让用户能够逐步理解每个要点。</think>#### VLAN子接口(Sub-Interface)的意义与作用 --- ### **1. 核心概念** **VLAN子接口**是在**单个物理接口**上创建的**虚拟逻辑接口**,每个子接口对应一个**VLAN ID**,用于在**三层设备**(如路由器、三层交换机)上实现**跨VLAN通信**或**单臂路由(Router-on-a-Stick)**。其意义主要体现在以下场景: --- ### **2. 核心意义与优势** #### **(1) 单物理接口支持多VLAN通信** - **问题背景**:当物理接口数量有限时,需通过一个接口连接多个VLAN。 - **解决方案**:创建子接口并绑定不同VLAN ID,例如: - 物理接口`GigabitEthernet0/1`上创建`G0/1.10`(VLAN 10)、`G0/1.20`(VLAN 20)。 - 每个子接口独立配置IP地址,作为对应VLAN的网关。 #### **(2) 实现跨VLAN路由(单臂路由)** - **功能**:通过子接口处理不同VLAN间的流量发,无需为每个VLAN单独分配物理接口。 - **示例**: - VLAN 10(市场部)与VLAN 20(技术部)需互通,通过子接口配置路由策略即可实现。 - 流量路径:终端 → 交换机(打VLAN标签) → 路由器子接口(拆标签并路由) → 目标VLAN。 #### **(3) 节省硬件资源** - **物理接口复用**:单物理接口承载多个逻辑子接口,减少对交换机端口或路由器接口的需求。 - **成本优化**:避免为每个VLAN单独部署物理链路。 #### **(4) 灵活的网络扩展** - **动态调整**:新增VLAN时,仅需在现有物理接口上添加子接口,无需改动物理拓扑。 - **兼容性**:支持与不同厂商设备对接(基于IEEE 802.1Q标准)。 --- ### **3. 技术实现细节** - **VLAN标签处理**: 子接口通过识别和剥离/添加**802.1Q标签**区分不同VLAN流量。例如: $$ \text{数据帧} = \text{目标MAC} + \text{源MAC} + \text{802.1Q头(VLAN ID)} + \text{载荷} $$ - **配置示例(以华为设备为例)**: ```plaintext interface GigabitEthernet0/0/1.10 // 创建子接口 dot1q termination vid 10 // 绑定VLAN 10 ip address 192.168.10.1 255.255.255.0 // 配置IP作为VLAN 10网关 ``` --- ### **4. 典型应用场景** 1. **企业网络分层** - 不同部门(如财务、研发)划分独立VLAN,通过子接口实现安全互通。 2. **云数据中心** - 虚拟机(VM)通过虚拟交换机绑定不同VLAN,由物理网卡子接口统一处理流量。 3. **运营商网络** - 在城域网中,通过子接口为不同客户分配独立VLAN,实现业务隔离。 --- ### **5. 与普通接口的对比** | **特性** | **普通物理接口** | **VLAN子接口** | |------------------|-------------------------------|-----------------------------------| | **绑定对象** | 物理硬件 | 物理接口 + VLAN ID | | **IP地址分配** | 每个接口独立IP | 每个子接口独立IP(对应不同VLAN) | | **适用场景** | 直连单一网络 | 跨VLAN路由、单臂路由 | | **资源占用** | 需多个物理接口 | 单物理接口复用 | --- ### **6. 总结** - **核心价值**:通过逻辑划分提升物理接口利用率,简化跨VLAN通信架构。 - **适用性**:需在**三层设备**上实现VLAN间路由或受限物理资源时,VLAN子接口是高效解决方案。 - **延伸应用**:结合QoS策略、ACL规则,可进一步实现流量优先级控制和安全隔离。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值