原文链接https://www.cnblogs.com/slyfox/p/6838127.html
1.面向接口编程是面想对象编程的一部分,附属于面向对象编程。
2.接口是没有方法主体代码的集合,可以被继承并实现。
3.接口是一组规则的集合,它规定了实现本接口的类或者接口必须拥有的能力或者规则,可以理解为如果你是XXX你必须能XXX的概念。
4.接口是在一定粒度视图上的同类事物的抽象表示。
5.接口可以在系统分层中,分清层次和依赖关系,直接依赖接口而不是具体的对象,实现解耦。
6.抽象类和接口,抽象类和子类之间应该是一般和特殊的关系,而接口仅仅是子类应该遵守的一组规则。
using System.Buffers;
using System.Security.AccessControl;
// See https://aka.ms/new-console-template for more information
using System;
//.net6 写法,不要main函数
Run();
static void Run()
{
Console.WriteLine("-------------");
FlashDisk flashDisk = new FlashDisk();
Mp3Player mp3Player = new Mp3Player();
MobileHardDisk mobileHardDisk = new MobileHardDisk();
Computer computer1 = new Computer(flashDisk);
computer1.WriteData();
computer1.ReadData();
System.Console.WriteLine("--------------");
Computer computer2 = new Computer();
computer2.UsbDrive = mp3Player;
computer2.ReadData();
computer2.WriteData();
mp3Player.PlayMusic();//子类拥有自己的方法
System.Console.WriteLine("------------------");
Computer computer3 = new Computer(mobileHardDisk);
computer3.ReadData();
computer3.WriteData();
System.Console.WriteLine("------------------");
Computer computer4 = new Computer(new NewStorage());
computer4.ReadData();
computer4.WriteData();
System.Console.WriteLine("------------------");
//包转发器的写法 Adpater
SuperStorage superStorage = new SuperStorage();
SuperStorageAdapter superStorageAdapter = new SuperStorageAdapter();
//包装期包装一层
superStorageAdapter.SuperStorage = superStorage;
//调用包装器封装后的对象
Computer computer5 = new Computer(superStorageAdapter);
computer5.ReadData();
computer5.WriteData();
System.Console.WriteLine("-----------------");
//包装期更简单的写法,推荐,继承的方式
SuperStorageAdapterV2 superStorageAdapterV2 = new SuperStorageAdapterV2();
Computer computer6 = new Computer(superStorageAdapterV2);
computer6.ReadData();
computer6.WriteData();
}
#region 接口
//定义读写接口
public interface IMobileStorage
{
void Read();
void Write();
}
#endregion
#region 具体的实现类
///移动存储
public class FlashDisk : IMobileStorage
{
public void Read()
{
Console.WriteLine("Reading from FlashDisk...");
Console.WriteLine("Read finished!");
}
public void Write()
{
Console.WriteLine("Writeing from FlashDisk...");
Console.WriteLine("Write finished!");
}
}
///mp3
public class Mp3Player : IMobileStorage
{
public void Read()
{
Console.WriteLine("Reading from mp3...");
Console.WriteLine("Read finished!");
}
public void Write()
{
Console.WriteLine("Writeing from mp3...");
Console.WriteLine("Write finished!");
}
///子类可以拥有自己的方法
public void PlayMusic()
{
System.Console.WriteLine("Music Is Playing....");
}
}
//移动硬盘
public class MobileHardDisk : IMobileStorage
{
public void Read()
{
Console.WriteLine("Reading from hardDisk...");
Console.WriteLine("Read finished!");
}
public void Write()
{
Console.WriteLine("Writeing from hardDisk...");
Console.WriteLine("Write finished!");
}
}
public class NewStorage : IMobileStorage
{
public void Read()
{
System.Console.WriteLine("Read from NewStorage..");
System.Console.WriteLine("Read is Finished!");
}
public void Write()
{
System.Console.WriteLine("Write from NewStorage..");
System.Console.WriteLine("Write is Finished!");
}
}
//特殊的实现用adapter包装一层
public class SuperStorage
{
public void Rd()
{
System.Console.WriteLine("SuperStorage from Rd");
}
public void Wt()
{
System.Console.WriteLine("SuperStorage from Wt");
}
}
//包装器 接口实现方法
public class SuperStorageAdapter : IMobileStorage
{
private SuperStorage _superStorage;
public SuperStorage SuperStorage
{
get { return _superStorage; }
set { _superStorage = value; }
}
public SuperStorageAdapter()
{
}
public SuperStorageAdapter(SuperStorage superStorage)
{
this._superStorage = superStorage;
}
public void Read()
{
_superStorage.Rd();
}
public void Write()
{
_superStorage.Wt();
}
}
//包装器 接口实现方法这个该方法更好,直接继承要被转换的类,调用基类的方法
public class SuperStorageAdapterV2 : SuperStorage, IMobileStorage
{
public void Read()
{
this.Rd();
}
public void Write()
{
this.Wt();
}
}
#endregion
#region 调用环境
public class Computer
{
private IMobileStorage _usbDrive;//一切基于接口
public IMobileStorage UsbDrive
{
get { return _usbDrive; }
set { _usbDrive = value; }
}
public Computer(IMobileStorage usbDrive)
{
//根据传进来的对象来决定调用什么方法,实现解耦和灵活调用
this._usbDrive = usbDrive;
}
public Computer()
{
}
public void ReadData()
{
_usbDrive.Read();
}
public void WriteData()
{
_usbDrive.Write();
}
}
#endregion