using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace MediaPlayerLibrary
{
public interface IMedia
{
void Play();
}
public abstract class AudioMedia : IMedia
{
public abstract void Play();
}
public abstract class VideoMedia : IMedia
{
public abstract void Play();
}
public class RM : VideoMedia
{
public override void Play()
{
MessageBox.Show("Play the RM file");
}
}
public class MPEG : VideoMedia
{
public override void Play()
{
MessageBox.Show("Play the MPEG file");
}
}
public class WAV : AudioMedia
{
public override void Play()
{
MessageBox.Show("Play the WAV file");
}
}
public class MP3 : AudioMedia
{
public override void Play()
{
MessageBox.Show("Play the MP3 file");
}
}
//根据不同的状况创建不同类型的方式,工厂模式是最拿手的,现在这里有两种不同的类型的媒体AudioMedia和VideoMedia(以后会更多)
//但他们同时又都实现IMedia接口,所以我们可以视其为一中产品,用工厂模式就可以了
//工厂模式的直接好处:并非是要解决Switch语句的难题,而是延迟对象的生成,以保证代码的灵活性
public interface IMediaFactory
{
IMedia CreateMedia();
}
public class MP3Factory : IMediaFactory
{
public IMedia CreateMedia()
{
return new MP3();
}
}
public class RMFactory : IMediaFactory
{
public IMedia CreateMedia()
{
return new RM();
}
}
public class MPEGFactory : IMediaFactory
{
public IMedia CreateMedia()
{
return new MPEG();
}
}
public class WAVFactory : IMediaFactory
{
public IMedia CreateMedia()
{
return new WAV();
}
}
//结论:在调用类对象的属性和方法时,尽量避免将具体类对象作为传递参数,而应该传递其抽象对象,更好地是传递接口
//将实际的调用和具体对象完全剥离开,这样提高代码的灵活性
public class MediaPlayer
{
public void Player(IMedia media)
{
media.Play();
}
}
}
转自:
http://www.cnblogs.com/wayfarer/articles/70453.html