18不使用委托实现能自动侦测车距的智能汽车
2014-03-26 00:09
369 查看
发明一辆智能汽车,能自动侦测与前方车辆的车距,当车距小于100米的时候,就报警。
□ 思路
● 报警器显然是观察者
● 智能汽车就是被观察者
智能汽车有一个侦测车距的方法,当车距小于100米的时候,就触发一个事件。这个事件就遍历所有注册的观察者,让每个观察这作出响应。
被观察者接口只负责注册和取消注册。
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
观察者接口也只有一个行为。
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
还需要一个被观察者抽象基类实现被观察者接口,他维护了一个被观察者的集合,并实施注册、取消注册和通知观察者,通知观察者的方法涉及为virtual,需要抽象类的子类来触发。
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
智能汽车就继承了被观察者这个抽象基类,他不仅有测距的方法,还有当车距小于100米时触发事件,触发事件的实质就是调用被观察者抽象基类的通知方法,让观察者作出响应。
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
主程序先让被观察者注册观察者,然后运行被观察者的方法,当车距小于100米,就触发被观察者的通知方法,实际上调用的是被观察者抽象基类的虚方法,挨个通知观察者作出响应。
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
结果:
□ 思路
● 报警器显然是观察者
● 智能汽车就是被观察者
智能汽车有一个侦测车距的方法,当车距小于100米的时候,就触发一个事件。这个事件就遍历所有注册的观察者,让每个观察这作出响应。
被观察者接口只负责注册和取消注册。
//被观察者接口
[code] public interface IObservable
{
void Register(IObserver obj);
void Unregister(IObserver obj);
}
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
观察者接口也只有一个行为。
//观察者接口
[code] public interface IObserver
{
void Update();
}
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
还需要一个被观察者抽象基类实现被观察者接口,他维护了一个被观察者的集合,并实施注册、取消注册和通知观察者,通知观察者的方法涉及为virtual,需要抽象类的子类来触发。
//被观察者抽象基类
[code] public abstract class SubjectBase : IObservable
{
private List<IObserver> container = new List<IObserver>();
public void Register(IObserver obj)
{
container.Add(obj);
}
public void Unregister(IObserver obj)
{
container.Remove(obj);
}
protected virtual void Notify()
{
foreach (IObserver observer in container)
{
observer.Update();
}
}
}
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
智能汽车就继承了被观察者这个抽象基类,他不仅有测距的方法,还有当车距小于100米时触发事件,触发事件的实质就是调用被观察者抽象基类的通知方法,让观察者作出响应。
public class SmartCar : SubjectBase
[code]{
private string brand = string.Empty;
private string type = string.Empty;
private int distance;
public SmartCar(string brand, string type)
{
this.brand = brand;
this.type = type;
this.distance = 1000;
}
public string Brand {get { return brand; }}
public string Type {get { return type; }}
public SmartCar():this("大众","Polo"){}
protected virtual void OnDistance()
{
base.Notify();//也就是遍历观察者,让观察者对动作有响应
}
public void DetectDistance()
{
for (int i = 200; i > 98; i--)
{
distance = i;
if (distance < 100)
{
OnDistance();
}
}
}
}
报警器就是观察者,只需要作响应。
public class Alarm : IObserver
{
public void Update()
{
Console.WriteLine("嘀嘀嘀:与前方车距小于100米,请保持好车距!");
}
}
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
主程序先让被观察者注册观察者,然后运行被观察者的方法,当车距小于100米,就触发被观察者的通知方法,实际上调用的是被观察者抽象基类的虚方法,挨个通知观察者作出响应。
class Program
[code]{
static void Main(string[] args)
{
SmartCar smartCar = new SmartCar();
Alarm alarm = new Alarm();
smartCar.Register(alarm);
smartCar.DetectDistance();
Console.ReadKey();
}
}
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
结果:
相关文章推荐
- C#构建多线程应用程序(1) —— 使用委托来自动创建次线程以实现异步方法的调用
- 使用 Sublime Text 做 Javascript 编辑器 - 集成 SublimeCodeIntel 实现代码智能提示及自动完成
- 使用 Sublime Text 做 Javascript 编辑器 - 集成 SublimeCodeIntel 实现代码智能提示及自动完成
- Unity中使用委托 代理 实现敌人自动检测目标并攻击
- 【智能物流】AGV在汽车零部件厂内物流的应用案例;AGV自动引导车选型手册
- unix自动登录Telnet,实现查看多台服务器硬盘及数据表空间使用情况
- Unity3D 使用备忘(三) 实现相机自动漫游开始、暂停、停止及相机角度切换。
- 使用C#实现ADSL自动拨号
- [auto-download-app] 如何使用 javascript 实现 app 自动下载
- 使用jsonp跨域调用百度js实现搜索框智能提示,并实现鼠标和键盘对弹出框里候选词的操作【附源码】
- 使用ViewPager实现图片自动切换
- SpringMVC中使用Interceptor+Cookie实现在一定天数之内自动登录
- mysql远程访问,主从/主主双机备份,以及使用keeplived实现故障自动切换(一)
- 使用事务实现--转账问题:从0001账户转1000块到0002账户。打开"隐式事务":设置为开,删除表中数据,回滚!(默认情况为关,如果打开了则不自动提交,学要手动提交)
- 使用VB实现邮箱自动注册(一):表单自动提交
- 在WinForm中使用WebServices来实现软件自动升级(AutoUpdate)(C#)
- SpringMVC中使用@RequestBody,@ResponseBody注解实现Java对象和XML/JSON数据自动转换(下)
- 引用 使用Session和Cookie实现网站自动登录
- SilverLight:使用MVVM实现View层在程序运行时自动生成控件并且取得其值
- php的_autoload函数实现自动加载类的使用