您的位置:首页 > 其它

18不使用委托实现能自动侦测车距的智能汽车

2014-03-26 00:09 369 查看
发明一辆智能汽车,能自动侦测与前方车辆的车距,当车距小于100米的时候,就报警。

 

□ 思路

● 报警器显然是观察者
● 智能汽车就是被观察者
智能汽车有一个侦测车距的方法,当车距小于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; }

结果:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐