<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FDesign_Pattern%2FTemplate_Pattern</id>
		<title>Java/Design Pattern/Template Pattern - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FDesign_Pattern%2FTemplate_Pattern"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Design_Pattern/Template_Pattern&amp;action=history"/>
		<updated>2026-04-22T01:52:43Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Design_Pattern/Template_Pattern&amp;diff=7797&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Design_Pattern/Template_Pattern&amp;diff=7797&amp;oldid=prev"/>
				<updated>2010-06-01T06:50:42Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:50, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Design_Pattern/Template_Pattern&amp;diff=7796&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Design_Pattern/Template_Pattern&amp;diff=7796&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:45Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Template Method Pattern ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//[C] 2002 Sun Microsystems, Inc.---&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.Iterator;&lt;br /&gt;
public class RunTemplateMethodPattern {&lt;br /&gt;
    public static void main(String [] arguments){&lt;br /&gt;
        System.out.println(&amp;quot;Example for the Template Method pattern&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot;This code demonstrates how the template method can&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot; be used to define a variable implementation for a&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot; common operation. In this case, the ProjectItem&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot; abstract class defines the method getCostEstimate,&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot; which is a combination of the cost for time and&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot; materials. The two concrete subclasses used here,&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot; Task and Deliverable, have different methods of&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot; providing a cost estimate.&amp;quot;);&lt;br /&gt;
        System.out.println();&lt;br /&gt;
        &lt;br /&gt;
        System.out.println(&amp;quot;Creating a demo Task and Deliverable&amp;quot;);&lt;br /&gt;
        System.out.println();&lt;br /&gt;
        Task primaryTask = new Task(&amp;quot;Put a JVM on the moon&amp;quot;, &amp;quot;Lunar mission as part of the JavaSpace program ;)&amp;quot;, 240.0, 100.0);&lt;br /&gt;
        primaryTask.addProjectItem(new Task(&amp;quot;Establish ground control&amp;quot;, &amp;quot;&amp;quot;, 1000.0, 10.0));&lt;br /&gt;
        primaryTask.addProjectItem(new Task(&amp;quot;Train the Javanaughts&amp;quot;, &amp;quot;&amp;quot;, 80.0, 30.0));&lt;br /&gt;
        Deliverable deliverableOne = new Deliverable(&amp;quot;Lunar landing module&amp;quot;, &amp;quot;Ask the local garage if they can make a few minor modifications to one of their cars&amp;quot;, 2800, 40.0, 35.0);&lt;br /&gt;
        &lt;br /&gt;
        System.out.println(&amp;quot;Calculating the cost estimates using the Template Method, getCostEstimate.&amp;quot;);&lt;br /&gt;
        System.out.println();&lt;br /&gt;
        System.out.println(&amp;quot;Total cost estimate for: &amp;quot; + primaryTask);&lt;br /&gt;
        System.out.println(&amp;quot;\t&amp;quot; + primaryTask.getCostEstimate());&lt;br /&gt;
        System.out.println();&lt;br /&gt;
        &lt;br /&gt;
        System.out.println(&amp;quot;Total cost estimate for: &amp;quot; + deliverableOne);&lt;br /&gt;
        System.out.println(&amp;quot;\t&amp;quot; + deliverableOne.getCostEstimate());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
abstract class ProjectItem implements Serializable{&lt;br /&gt;
    private String name;&lt;br /&gt;
    private String description;&lt;br /&gt;
    private double rate;&lt;br /&gt;
    &lt;br /&gt;
    public ProjectItem(){}&lt;br /&gt;
    public ProjectItem(String newName, String newDescription, double newRate){&lt;br /&gt;
        name = newName;&lt;br /&gt;
        description = newDescription;&lt;br /&gt;
        rate = newRate;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void setName(String newName){ name = newName; }&lt;br /&gt;
    public void setDescription(String newDescription){ description = newDescription; }&lt;br /&gt;
    public void setRate(double newRate){ rate = newRate; }&lt;br /&gt;
    &lt;br /&gt;
    public String getName(){ return name; }&lt;br /&gt;
    public String getDescription(){ return description; }&lt;br /&gt;
    public final double getCostEstimate(){&lt;br /&gt;
        return getTimeRequired() * getRate() + getMaterialsCost();&lt;br /&gt;
    }&lt;br /&gt;
    public double getRate(){ return rate; }&lt;br /&gt;
    &lt;br /&gt;
    public String toString(){ return getName(); }&lt;br /&gt;
    &lt;br /&gt;
    public abstract double getTimeRequired();&lt;br /&gt;
    public abstract double getMaterialsCost();&lt;br /&gt;
}&lt;br /&gt;
class Task extends ProjectItem{&lt;br /&gt;
    private ArrayList projectItems = new ArrayList();&lt;br /&gt;
    private double taskTimeRequired;&lt;br /&gt;
    &lt;br /&gt;
    public Task(){ }&lt;br /&gt;
    public Task(String newName, String newDescription,&lt;br /&gt;
        double newTaskTimeRequired, double newRate){&lt;br /&gt;
        super(newName, newDescription, newRate);&lt;br /&gt;
        taskTimeRequired = newTaskTimeRequired;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void setTaskTimeRequired(double newTaskTimeRequired){ taskTimeRequired = newTaskTimeRequired; }&lt;br /&gt;
    public void addProjectItem(ProjectItem element){&lt;br /&gt;
        if (!projectItems.contains(element)){&lt;br /&gt;
            projectItems.add(element);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public void removeProjectItem(ProjectItem element){&lt;br /&gt;
        projectItems.remove(element);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public double getTaskTimeRequired(){ return taskTimeRequired; }&lt;br /&gt;
    public Iterator getProjectItemIterator(){ return projectItems.iterator(); }&lt;br /&gt;
    public double getMaterialsCost(){&lt;br /&gt;
        double totalCost = 0;&lt;br /&gt;
        Iterator items = getProjectItemIterator();&lt;br /&gt;
        while (items.hasNext()){&lt;br /&gt;
            totalCost += ((ProjectItem)items.next()).getMaterialsCost();&lt;br /&gt;
        }&lt;br /&gt;
        return totalCost;&lt;br /&gt;
    }&lt;br /&gt;
    public double getTimeRequired(){&lt;br /&gt;
        double totalTime = taskTimeRequired;&lt;br /&gt;
        Iterator items = getProjectItemIterator();&lt;br /&gt;
        while (items.hasNext()){&lt;br /&gt;
            totalTime += ((ProjectItem)items.next()).getTimeRequired();&lt;br /&gt;
        }&lt;br /&gt;
        return totalTime;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class Deliverable extends ProjectItem{&lt;br /&gt;
    private double materialsCost;&lt;br /&gt;
    private double productionTime;&lt;br /&gt;
    &lt;br /&gt;
    public Deliverable(){ }&lt;br /&gt;
    public Deliverable(String newName, String newDescription,&lt;br /&gt;
        double newMaterialsCost, double newProductionTime,&lt;br /&gt;
        double newRate){&lt;br /&gt;
        super(newName, newDescription, newRate);&lt;br /&gt;
        materialsCost = newMaterialsCost;&lt;br /&gt;
        productionTime = newProductionTime;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void setMaterialsCost(double newCost){ materialsCost = newCost; }&lt;br /&gt;
    public void setProductionTime(double newTime){ productionTime = newTime; }&lt;br /&gt;
    &lt;br /&gt;
    public double getMaterialsCost(){ return materialsCost; }&lt;br /&gt;
    public double getTimeRequired(){ return productionTime; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Template pattern in Java ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
The Design Patterns Java Companion&lt;br /&gt;
Copyright (C) 1998, by James W. Cooper&lt;br /&gt;
IBM Thomas J. Watson Research Center&lt;br /&gt;
*/&lt;br /&gt;
import java.awt.Color;&lt;br /&gt;
import java.awt.Graphics;&lt;br /&gt;
import java.awt.Point;&lt;br /&gt;
import java.awt.event.WindowAdapter;&lt;br /&gt;
import java.awt.event.WindowEvent;&lt;br /&gt;
import java.util.Vector;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JPanel;&lt;br /&gt;
public class TriangleDrawing extends JFrame {&lt;br /&gt;
  stdTriangle t, t1;&lt;br /&gt;
  IsocelesTriangle it;&lt;br /&gt;
  public TriangleDrawing() {&lt;br /&gt;
    super(&amp;quot;Draw triangles&amp;quot;);&lt;br /&gt;
    addWindowListener(new WindowAdapter() {&lt;br /&gt;
      public void windowClosing(WindowEvent e) {&lt;br /&gt;
        System.exit(0);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
    TPanel tp = new TPanel();&lt;br /&gt;
    t = new stdTriangle(new Point(10, 10), new Point(150, 50), new Point(&lt;br /&gt;
        100, 75));&lt;br /&gt;
    it = new IsocelesTriangle(new Point(150, 100), new Point(240, 40),&lt;br /&gt;
        new Point(175, 150));&lt;br /&gt;
    t1 = new stdTriangle(new Point(150, 100), new Point(240, 40),&lt;br /&gt;
        new Point(175, 150));&lt;br /&gt;
    tp.addTriangle(t);&lt;br /&gt;
    tp.addTriangle(it);&lt;br /&gt;
    // tp.addTriangle(t1);&lt;br /&gt;
    getContentPane().add(tp);&lt;br /&gt;
    setSize(300, 200);&lt;br /&gt;
    setBackground(Color.white);&lt;br /&gt;
    setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] arg) {&lt;br /&gt;
    new TriangleDrawing();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class TPanel extends JPanel {&lt;br /&gt;
  Vector triangles;&lt;br /&gt;
  public TPanel() {&lt;br /&gt;
    triangles = new Vector();&lt;br /&gt;
  }&lt;br /&gt;
  public void addTriangle(Triangle t) {&lt;br /&gt;
    triangles.addElement(t);&lt;br /&gt;
  }&lt;br /&gt;
  public void paint(Graphics g) {&lt;br /&gt;
    for (int i = 0; i &amp;lt; triangles.size(); i++) {&lt;br /&gt;
      Triangle tngl = (Triangle) triangles.elementAt(i);&lt;br /&gt;
      tngl.draw(g);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
abstract class Triangle {&lt;br /&gt;
  Point p1, p2, p3;&lt;br /&gt;
  public Triangle(Point a, Point b, Point c) {&lt;br /&gt;
    //save&lt;br /&gt;
    p1 = a;&lt;br /&gt;
    p2 = b;&lt;br /&gt;
    p3 = c;&lt;br /&gt;
  }&lt;br /&gt;
  public void draw(Graphics g) {&lt;br /&gt;
    //This routine draws a general triangle&lt;br /&gt;
    drawLine(g, p1, p2);&lt;br /&gt;
    Point current = draw2ndLine(g, p2, p3);&lt;br /&gt;
    closeTriangle(g, current);&lt;br /&gt;
  }&lt;br /&gt;
  public void drawLine(Graphics g, Point a, Point b) {&lt;br /&gt;
    g.drawLine(a.x, a.y, b.x, b.y);&lt;br /&gt;
  }&lt;br /&gt;
  //this routine is the &amp;quot;Hook&amp;quot; that has to be implemented&lt;br /&gt;
  //for each triangle type.&lt;br /&gt;
  abstract public Point draw2ndLine(Graphics g, Point a, Point b);&lt;br /&gt;
  public void closeTriangle(Graphics g, Point c) {&lt;br /&gt;
    //draw back to first point&lt;br /&gt;
    g.drawLine(c.x, c.y, p1.x, p1.y);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class stdTriangle extends Triangle {&lt;br /&gt;
  public stdTriangle(Point a, Point b, Point c) {&lt;br /&gt;
    super(a, b, c);&lt;br /&gt;
  }&lt;br /&gt;
  public Point draw2ndLine(Graphics g, Point a, Point b) {&lt;br /&gt;
    g.drawLine(a.x, a.y, b.x, b.y);&lt;br /&gt;
    return b;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class IsocelesTriangle extends Triangle {&lt;br /&gt;
  Point newc;&lt;br /&gt;
  int newcx, newcy;&lt;br /&gt;
  int incr;&lt;br /&gt;
  public IsocelesTriangle(Point a, Point b, Point c) {&lt;br /&gt;
    super(a, b, c);&lt;br /&gt;
    double dx1 = b.x - a.x;&lt;br /&gt;
    double dy1 = b.y - a.y;&lt;br /&gt;
    double dx2 = c.x - b.x;&lt;br /&gt;
    double dy2 = c.y - b.y;&lt;br /&gt;
    double side1 = calcSide(dx1, dy1);&lt;br /&gt;
    double side2 = calcSide(dx2, dy2);&lt;br /&gt;
    if (side2 &amp;lt; side1)&lt;br /&gt;
      incr = -1;&lt;br /&gt;
    else&lt;br /&gt;
      incr = 1;&lt;br /&gt;
    double slope = dy2 / dx2;&lt;br /&gt;
    double intercept = c.y - slope * c.x;&lt;br /&gt;
    //move point c so that this is an isoceles triangle&lt;br /&gt;
    newcx = c.x;&lt;br /&gt;
    newcy = c.y;&lt;br /&gt;
    while (Math.abs(side1 - side2) &amp;gt; 1) {&lt;br /&gt;
      newcx += incr; //iterate a pixel at a time until close&lt;br /&gt;
      newcy = (int) (slope * newcx + intercept);&lt;br /&gt;
      dx2 = newcx - b.x;&lt;br /&gt;
      dy2 = newcy - b.y;&lt;br /&gt;
      side2 = calcSide(dx2, dy2);&lt;br /&gt;
    }&lt;br /&gt;
    newc = new Point(newcx, newcy);&lt;br /&gt;
  }&lt;br /&gt;
  //calculate length of side&lt;br /&gt;
  private double calcSide(double dx, double dy) {&lt;br /&gt;
    return Math.sqrt(dx * dx + dy * dy);&lt;br /&gt;
  }&lt;br /&gt;
  //draws 2nd line using saved new point&lt;br /&gt;
  public Point draw2ndLine(Graphics g, Point b, Point c) {&lt;br /&gt;
    g.drawLine(b.x, b.y, newc.x, newc.y);&lt;br /&gt;
    return newc;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>