设计包括:工产模式,单例模式,回调函数,面向接口编程
步骤:
1.创建Base抽象类(提供外部调用的方法和字段)
2.创建继承Base类的基类(实现抽象类的方法)
3.创建用于实现单例模式的类用于提供相对应的播放器进。
public abstract class PlayerBase(){
///抽象类
}
public class VlcPlayer:PlayerBase{
//方法的实现
}
public class XXXPlayer:PlayerBase{
//方法的实现
}
public sealed class PlayInstance() //单例模式+简单工厂
{
private static PlayerBase_vlcPlayer;
private static PlayerBase_XXXPlayer;
/// Action 自定义回调函数
public static BasePlayer GetPlayerInstnce(Action EndReachedAction, Action PlayingAction, Action<float> PositionChanged, Action<double> TimeChanged, string PlayerType = "VLC")
{
switch(PlayerType){
case :"VLC"
if(_vlcPlayer==null){
_vlcPlayer=new VlcPlayer(EndReachedAction, PlayingAction, PositionChanged, TimeChanged);
return _vlcPlayer ;
case :"XXX"
if(_XXXPlayer==null){
_XXXPlayer=new XXXPlayer(EndReachedAction, PlayingAction, PositionChanged, TimeChanged);
}
return _XXXPlayer;
default:
return null;
}
}
public static void Dispose(){}
}
}
抽象类与接口的区别:https://www.cnblogs.com/chunhui212/p/5892273.html
相同点:
- 都可以被继承
- 都不能实例化
- 都可以包含方法声明
- 派生类必须实现未实现的方发
区别:
- 抽象基类可以定义字段,属性,方法的实现,接口只能定义属性,索引器,事件和昂发声明不能包含字段
- 抽象类是一个不完整的类,需要进一步细化,而接口是一个行为规范,接口表诉我能做
- 接口可以多重实现,抽象类只能呗单一继承
- 抽象类更多的定义在一系列紧密相关的类间,而接口大多数是关系疏松单都实现某一功能的类中
- 抽象类是一系列相关对象抽象出来的概念,反应事物的内部共性,接口时为了满足外部调用而定义的一个功能约定,因此反应的是事物的外部特性
- 接口基本上不具备集成的任何具体特点,仅承诺能够调用的方法
- 接口可以用于支持回调,而继承不具备这个特点
- 抽象类实现的具体方法是需的,单实现接口的类中的方法却默认为非虚的,
- 如果抽象类实现接口,则可以把接口方法映射到抽象类中作为抽象方法而不必实现,而在抽象类中的子类中实现接口中的方法
使用规则:
- 抽象类主要用于关系紧密的对象,而接口最合适为不相关的类提供通用功能
- 设计大的功能单元使用抽象类,设计小而简练的功能块使用接口
- 预计要创建多个版本,则创建抽象类,接口一旦创建就不能修改,如果需要接口的新版本,则必须创建一个全新的接口
- 创建的功能将在大范围的权宜对象间使用则使用接口,在组件的所有实现间提供通用的已实现功能,则使用抽象类
- 分析对象,提炼内部共性形成抽象类,,用于表示对象本质即是什么,为外部提供调用或功能需要扩充时优选接口
- 好的接口定义应该具有专一功能性,而不是多功能,否则造成接口污染,如果一个类只是实现了这个接口的中的一个功能而不得不去实现接口中的其他方法,就叫接口污染
- 尽量避免使用继承来实现组件功能,而是使用黑箱复合,即对象组合,因为继承的层次增多,造成最直接的后果就是你调用这个类群中某一类,就必须把他们全部加载到栈中。
接口:
- 个性大于共性,
- 差异较大的个性间具有某些相同的行为,
- 相同行为的实现方式有较大区别使用
- 当差异较大的对象寻求功能上的共性时
抽象:
- 共性大于个性,
- 共性相同的个体间必然具有相同的属性与行为
- 相同行为的实现方式具有一定区别使用
- 当在共性较多的对象间寻求功能上的差异